使用@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方法注入。

到此这篇关于使用@Autowired注解警告Field injection is not recommended的解决的文章就介绍到这了,更多相关@Autowired注解警告内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Spring注解--@Autowired、@Resource和@Service

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

  • 基于Spring@Autowired注解与自动装配详谈

    1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss 拥有 Office 和 Car 类型的两个属性: 清单 3. Boss.java package com.baobaotao; public class Boss { private Car car; private Office office; // 省略 get/setter @Override p

  • Spring框架中 @Autowired 和 @Resource 注解的区别

    Spring框架中 @Autowired 和 @Resource 注解的区别 在 spring 框架中,除了使用其特有的注解外,使用基于 JSR-250 的注解,它包括 @PostConstruct, @PreDestroy 和 @Resource 注释. 首先,咱们简单了解 @PostConstruct 和 @PreDestroy 注释: 为了定义一个 bean 的安装和卸载,我们可以使用 init-method 和 destroy-method 参数简单的声明一下 ,其中 init-meth

  • Spring注解@Resource和@Autowired区别对比详解

    前言 @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入. 1.共同点 两者都可以写在字段和setter方法上.两者如果都写在字段上,那么就不需要再写setter方法. 2.不同点 (1)@Autowired @Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory

  • 使用@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 be

  • 使用@Autowired注解引入server服务层方法时报错的解决

    目录 @Autowired注解引入server服务层方法时报错 网上搜的方法:还行 JavaBean属性 方法 关于@Autowired 注解时发生的错误 1.解决 2.解决 @Autowired注解引入server服务层方法时报错 contentTypeService in com.example.demo001.controller.ContentTypeController required a bean of type 'com.example.demo001.service.Conte

  • @Autowired注解在抽象类中失效的原因及解决

    @Autowired注解在抽象类中失效 最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是出现空指针异常,通过日志的打印,发现是这个dao注入失败为空.然后通过new出spring上下文对象,再去调用getBean()方法,获取到这个注入的dao,这样是可行的,但是总是觉得这不是最佳实践,一定有比这个更加优雅的方式能解决这个问题. 我们来还原一下这个问题: 1.定义一个抽象类 声明为spring组件,在其中自动装配另一个bean: @Compo

  • @Autowired注解注入的xxxMapper报错问题及解决

    目录 @Autowired注解注入的xxxMapper报错 项目场景 问题描述 解决方案 分析 @Autowired无法加载Mapper,报错404或者500 @Autowired注解注入的xxxMapper报错 项目场景 Mybatis-Plus测试 问题描述 在Mybatis-Plus场景的测试中发现,通过@Autowired注解注入的userMapper会报错 这是因为UserMapper 并不是一个可以创建出对象的一个类,而是一个接口. @Override public void run

  • Intellij IDEA如何去掉@Autowired 注入警告的方法

    问题 在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入 @Autowired private ProductMapper productMapper; 但是这样Intellij IDEA会显示红色告警,提示不能自动注入. 当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired 注解,这时候不显示红色警告,但是也显示Field injection is not recommended 的建议 原因 第一种

  • Spring为什么不推荐使用@Autowired注解详析

    目录 引言 Spring的三种注入方式 属性(filed)注入 构造器注入 set方法注入 属性注入可能出现的问题 问题一 问题二 问题三 spring建议 使用@Resource代替@Autowired 使用@RequiredArgsConstructor构造器方式注入 总结 引言 使用IDEA开发时,同组小伙伴都喜欢用@Autowired注入,代码一片warning,看着很不舒服,@Autowired作为Spring的亲儿子,为啥在IDEA中提示了一个警告:Field injection i

  • idea中@Autowired注解下变量报红的解决

    目录 idea中@Autowired注解下变量报红 问题 解决方法 注解@Autowired--警告(亲测可用) 变量(filed)注入 构造器注入 set方法注入 小结下 idea中@Autowired注解下变量报红 问题 idea中@Autowired注解下变量报红 这个不是错误,只是一个警告而已,其实不解决也是可以启动项目的 解决方法 1.修改设置 file–>settings–>Inspections–>spring Core–>Code–>Autowiring fo

  • 为什么Spring和IDEA都不推荐使用 @Autowired 注解

    目录 前言 Spring为什么不推荐使用@Autowired 注解 背景 原因 解决 思考 @Autowired, @Qualifier, @Resource, 三者有何区别 参考文档 前言 请看下面几个问题 Spring为什么不推荐使用@Autowired 注解? 为什么推荐使用@Resource 代替 @Autowired 注解? 如何快速使用构造注入代替 @Autowired ? @Autowired, @Qualifier, @Resource, 三者有何区别? 下面, 我们带着以上问题

  • Spring使用@Autowired注解实现自动装配方式

    目录 Spring支持注解配置 引入注解依赖 启用注解 使用@Autowired注解实现自动装配 1.IOC容器配置 2.实体类使用@Autowired注解注入属性 3.测试结果 @Autowired注解的使用和注入规则 1.使用在变量域上面 2.@Autowired注解使用在构造器上面 Spring支持注解配置 引入注解依赖 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="ht

  • Spring详细讲解@Autowired注解

    目录 java注解 spring注解 (1)配置文件形式 (2)注解形式 @Autowired的解析 @Autowired的生效流程 java注解 在解释spring的注解之前,先了解一下什么是java的注解?:Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java中类.变量.参数. 包等都可以添加注解,java的注解可以通过反射来获取到标注的内容,在编译器生成字节码文件时,标注信息也添加进去.当运行时,JVM可以根据标注信息获取相应的信息.

随机推荐