@Autowired注解问题
@Autowired Field injection is not recommended
项目上一直都是这么写的,今天记录下idea给出提示的原因。
历史
使用spring开发,用到的注入注解还有@Inject、@Resource两种。
@Autowired/Inject根据type寻找bean,如果有@Qualifier则根据指定的name匹配,否则根据变量名匹配;
@Resource则可以指定Type和Name以寻找唯一的bean
但是,idea会提示:不建议使用field 方式注入!
field方式就是给类一个变量,本质上是通过反射注入到field(依赖的接口的实例准备好了吗?);由于是从容器中拿的,导致容器管理的类依赖容器才能完成实例化;单元测试必须使用反射或者容器;如果遇到构造时依赖的实例没有准备好?
对于必须的依赖使用构造方式注入
构造函数一定会执行,
private final UserDetailsService userDetailsService; // 注意这里可以使用final了
// @Auwoired Spring 4.3以后如果此类只有一个构造函数可以不写
public SecurityConfig(UserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
对于可选的或者可变的依赖使用setter方式注入
private final UserDetailsService userDetailsService = null;
// @Auwoired Spring 4.3以后不用写
public void setUserDetailsService(UserDetailsService userDetailsService_in) {
this.serDetailsService = userDetailsService_in;
}
缺点
如果有多个依赖,会写很长的构造方法。。。