Java Spring自动连线类

Java Spring自动连线类,java,spring,dependency-injection,inversion-of-control,Java,Spring,Dependency Injection,Inversion Of Control,当我们将一个类注释为@Autowired时,它必须是一个接口还是可以是一个类 我看到的所有使用Spring的示例都使用接口,然后在类上实现它。然后使用接口类型调用具体类上的函数。我们不能简单地将@Autowired添加到一个具体的类而不是一个接口 我知道JAVA中的接口类比程序,但如果你不依赖多态性,那么为什么要编写接口呢 不,您不必使用接口,就Spring而言,这是完全正确的: @Service public class FooService { @Autowired priv

当我们将一个类注释为
@Autowired
时,它必须是一个接口还是可以是一个类

我看到的所有使用Spring的示例都使用接口,然后在类上实现它。然后使用接口类型调用具体类上的函数。我们不能简单地将
@Autowired
添加到一个具体的类而不是一个接口


我知道JAVA中的接口类比程序,但如果你不依赖多态性,那么为什么要编写接口呢

不,您不必使用接口,就Spring而言,这是完全正确的:

@Service
public class FooService {
    @Autowired
    private FooDao fooDao;
}
或者,您甚至可以进行施工注入:

@Service
public class FooService {

    private final FooDao fooDao;

    public FooService(FooDao fooDao) {
        this.fooDao = fooDao;
    }
}
通常,接口是由每一个后续代重复的长期实践。如果不需要,不要使用它们。如果它们总是只有一个实现,或者您想要模拟这样一个类(现代模拟框架模拟类没有任何问题),则不需要它们


注入具体类也没有什么错,比如上面示例中的
FooDao
。它有一些技术含义。代理,但没有什么是不可理解的。

从技术上讲,
@Autowired
可以用于实现或接口。春天不在乎它。注入接口是一种设计策略。

@Autowired也可以用于类而不是接口。 但是,使用接口将是更好的实践,因为它减少了组件之间的硬耦合