Field injection is not recommended

596 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

记录开发过程中碰到的小问题:Field injection is not recommended,属性注入不被推荐的。

1. 问题描述

使用IDEA开发项目时,使用注解注入时,经常会出现@AUtowired注解报警告的问题,如下:

image.png

在IDEA中将鼠标放至警告上显示详细信息为:

image.png

错误内容:Field injection is not recommended,即属性注入不被推荐的。

2. 问题原因

  • 问题出现主要是由于Spring 4.x版本之后不再推荐使用Field注入的方式,因此IDEA会发现该规范问题并提示警告。
  • 因为是IDEA的警告,且只是Spring不再推荐的使用方式,因此虽然有警告提醒,但是不会影响程序的执行。

3. 问题解决方法

  1. 关闭IDEA的提醒,眼不见为净,但是万一出现了真正的问题也看不到了。

    • IDEA中,Settings -> Editor -> Inspections -> Spring -> Spring Core -> Core -> Field Injection warning将Severity属性值改为 “ No highlighting,only fix ”
  2. 使用其他Spring推荐的注入方法来代替Field注入方式

    • 构造器注入
    • setter注入

4. Spring的三种注入方式

  1. Field注入:代码简洁有效,依赖对象可能为null而报空指针异常,容易出现循环依赖问题
 @Autowired
 private GoodsCategoryService goodsCategoryService;
  1. 构造器注入:spring 4.x推荐使用,强制性的显式注入(final关键字保证不可变)、避免空指针和循环依赖,在需要注入的依赖较多时,使用构造方法臃肿
private final GoodsCategoryService goodsCategoryService;
@Autowired
public GoodServiceImpl(GoodsCategoryService goodsCategoryService){
    this.goodsCategoryService = goodsCategoryService;
}
  1. setter注入:spring 3.x推荐,选择性注入,可有可无,依赖不会影响整个项目运行
    • 在对象实例化后,依赖信息依然可以通过set方法修改,不太好
 private GoodsCategoryService goodsCategoryService;
 @Autowired
 public setGoodsCategoryService(GoodsCategoryService goodsCategoryService){
     this.goodsCategoryService = goodsCategoryService;
 }    

5. bean注入相关注解

  • @Autowired:表示自动注入,自动从spring的上下文找到合适的bean进行注入
  • @Resource:表示按指定名称注入,可通过byName和byType的方式注入,默认按照byName,如果找不到会尝试使用byType匹配
  • @Qualifier和@Autowired:一个接口有多个实现时,可以在实现中用@Service注解为不同的实现bean指定名称,在注入时使用@Qualifier注解指定value为对应的实现bean