@Autowired注解警告Field injection is not recommended

在使用spring框架中的依赖注入注解@Autowired时,idea报了一个警告
大部分被警告的代码都是不严谨的地方,所以我深入了解了一下。
被警告的代码如下:

@Autowired
UserDao userDao;

警告内容是

Field injection is not recommended

意思就是使用变量依赖注入的方式是不被推荐的。
使用idea解决策略是这样的:

Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies

意思就是总是使用构造器的方式强制注入。

依赖注入有三种方式:

变量(filed)注入
构造器注入
set方法注入
先各自看一下实现方式
变量(filed)注入

@Autowired
UserDao userDao;

构造器注入

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方式注入或者构造器注入,这两种方式的选择就要看这个类是强制依赖的话就用构造器方式,选择依赖的话就用set方法注入。

原文地址:https://www.cnblogs.com/felixzh/p/10752653.html

时间: 2024-10-31 11:26:50

@Autowired注解警告Field injection is not recommended的相关文章

Field injection is not recommended和Could not autowired. No beans of 'xxx' type found.

目录 问题 解决办法 备注 问题 在项目中,我们使用Spring的@Autowired注解去引入其他类时有时候阿里的编码规约插件就会提示:"Field injection is not recommended"或"Could not autowired. No beans of 'xxx' type found.",引用类的变量名会有红色的波浪线,虽然不影响程序执行,但是强迫症看着还是难受. 解决办法 将"@Autowired"注解换为"

IntelliJ IDEA:Field injection is not recommended

使用IntelliJ IDEA进行开发的时候,code analyze的时候会出现提示"Field injection is not recommended". stackoverflow上有篇回答:http://stackoverflow.com/questions/39890849/what-exactly-is-field-injection-and-how-to-avoid-it 国外有篇文章:http://vojtechruzicka.com/field-dependency

Spring5:@Autowired注解、@Resource注解和@Service注解

什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低 2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率 为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java

@Autowired注解(转)

5.6.4 @Autowired注解 自Spring诞生以来,的autowire和dependency-check属性便一直存在.当JDK 5.0正式发布后,Spring针对dependency-check属性引入了对应的@Required.同理,它针对autowire属性引入了对应的@Autowired注解,其定义摘录如下. Java代码 收藏代码 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.CONSTRUCTOR, Ele

@Autowired注解

@Autowired注解,默认情况下,如果因为找不到合适的bean将会导致autowiring抛出失败异常,可以通过@Autowired(required=false)的方式避免. @Autowired注解可以用于成员变量.set方法.构造器(一个类中只能有一个构造被注释成@Autowired(required=true)).list集合.map. 新建一个web项目,导入jar包,jar包如图: 一.@Autowired注解用于成员变量.set方法.构造器(一个类中只能有一个构造被注释成@Au

@Resource与@Autowired注解的区别

一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我:我研究一下. 在大学,学习J2EE实训时一直使用的是@Resource注解,后来我就养成习惯了.现在对这两个注解做一下解释: @Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配 @Resource(import javax.annotation.

@Autowired注解与@Qualifier注解搭配使用

问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean

@Autowired注解与@Qualifier注解搭配使用----解决多实现选择注入问题

问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean

Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配

@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程.通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的. AutowiredAnnotationBeanPostProcessor 类图 PriorityOrdered:确认 AutowiredAnnotationBeanPostProcessor 后置处理器的执行优先级 BeanFactoryAw