关于java:关于AutoWired依赖注入时有警告Field-injection-is-not-recommended

8次阅读

共计 971 个字符,预计需要花费 3 分钟才能阅读完成。

代码

@Autowired
private JedisServer jedisServer;

此时 @AutoWired 上面有黄色的波浪线作为正告,正告的内容是

Field injection is not recommended 

大抵的意思是,不倡议以变量注入

芝士

依赖注入的形式有三种

  • 变量(filed)注入
  • 结构器注入
  • set 办法注入

各自的注入形式如下

* 变量 (filed) 注入

@Autowired
private JedisServer jedisServer;

* 结构器注入

    final
    UserDao userDao;

    @Autowired
    public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}
  • set 办法注入
    private UserDao userDao;

    @Autowired
    public void setUserDao (UserDao userDao) {this.userDao = userDao;}

三种办法比较而言

长处:变量形式注入十分简洁,没有任何多余代码,十分无效的进步了 java 的简洁性。即便再多几个依赖一样能解决掉这个问题。

毛病:不能无效的指明依赖。置信很多人都遇见过一个 bug,依赖注入的对象为 null,在启动依赖容器时遇到这个问题都是配置的依赖注入少了一个注解什么的,然而这种形式就过于依赖注入容器了,当没有启动整个依赖容器时,这个类就不能运行,在反射时无奈提供这个类须要的依赖。
在应用 set 形式时,这是一种抉择注入,可有可无,即便没有注入这个依赖,那么也不会影响整个类的运行。
在应用结构器形式时曾经显式注明必须强制注入。通过强制指明依赖注入来保障这个类的运行。

另一个方面:
依赖注入的核心思想之一就是被容器治理的类不应该依赖被容器治理的依赖,换成文言来说就是如果这个类应用了依赖注入的类,那么这个类解脱了这几个依赖必须也能失常运行。然而应用变量注入的形式是不能保障这点的。
既然应用了依赖注入形式,那么就表明这个类不再对这些依赖负责,这些都由容器治理,那么如何分明的晓得这个类须要哪些依赖呢?它就要应用 set 办法形式注入或者结构器注入。

总结下:
变量形式注入应该尽量避免,应用 set 形式注入或者结构器注入,这两种形式的抉择就要看这个类是强
另外将 @AutoWired 注解换成 @Resource 注解也能够将黄色正告去掉

正文完
 0