Loading

@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;
}

缺点

如果有多个依赖,会写很长的构造方法。。。

posted @ 2021-01-14 21:02  ly_arise  阅读(124)  评论(0编辑  收藏  举报