当我们将一个类注释为@Autowired
时,它必须是一个接口还是一个类?
使用Spring的所有示例我已经看过,使用接口然后在类上实现它。然后使用接口类型调用Concrete类上的函数。我们不能简单地将@Autowired
添加到具体类而不是接口。
我知道JAVA中的接口类比该程序,但如果你不依赖于多态,那么为什么要写一个接口呢?
答案 0 :(得分:4)
不,你不必使用接口,就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
。它有一些技术含义。代理,但没有什么是无法理解的。
答案 1 :(得分:3)
技术上@Autowired
可用于实现或接口。春天不关心它。注入界面是一种设计策略。
答案 2 :(得分:2)
@Autowired也可以与类而不是接口一起使用。 但是,使用接口将是一种更好的做法,因为它减少了组件之间的硬耦合。