Spring 不推荐使用 @Autowired 字段注入的原因是什么? 应该怎么使用?
Spring框架中,虽然@Autowired
可以用于字段注入,但是并不推荐这种用法。主要原因有以下几点:
- 测试难度:使用字段注入,会使得在不使用Spring容器的情况下,比如单元测试时,很难为这些依赖注入模拟的实现。
-
不可变性:如果使用构造器注入,你的依赖可以是
final
的,这样就可以保证它们的不可变性。而字段注入无法做到这一点。 -
依赖隐藏:字段注入可能会隐藏类的依赖,使得依赖关系不清晰。当一个类有很多字段注入时,很难一眼就看出这个类都依赖哪些其他的类或者组件。
因此,Spring推荐使用构造器注入。这样做的好处是,你可以清楚地看到该类的依赖关系(通过构造函数的参数),并且这些依赖可以是final
的,保证了它们的不可变性。此外,使用构造器注入,可以更容易地在不使用Spring容器的情况下,比如进行单元测试时,为这些依赖提供模拟的实现。
以下是使用构造器注入的例子:
@Service
public class MyService {
private final MyDao myDao;
@Autowired
public MyService(MyDao myDao) {
this.myDao = myDao;
}
//...
}
在这个例子中,MyService
依赖于MyDao
,并且这个依赖关系是通过构造器注入实现的。这样,我们就可以很清楚地看到MyService
的依赖,并且这个依赖是final
的,保证了它的不可变性。