【问题标题】:Spring Autowired Class弹簧自动装配类
【发布时间】:2012-10-18 22:37:22
【问题描述】:
当我们将一个类注解为@Autowired 时,它必须是一个接口还是可以是一个类?
我见过的所有使用Spring的例子,都是使用一个接口,然后在一个类上实现。然后使用接口类型调用具体类上的函数。我们能不能简单地将@Autowired 添加到具体类而不是接口中。
我知道程序以JAVA中的接口类比,但是如果你不依赖多态,那为什么要写一个接口呢?
【问题讨论】:
标签:
java
spring
dependency-injection
inversion-of-control
【解决方案1】:
不,你不必使用接口,就 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。它有一些技术含义。代理,但没有什么是不能理解的。
【解决方案2】:
从技术上讲,@Autowired 可用于实现或接口。春天不在乎。注入接口是一种设计策略。
【解决方案3】:
@Autowired 也可以用于类而不是接口。
但是,使用接口会是一种更好的做法,因为它减少了组件之间的硬耦合。