`

使用@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的解决

    然而,IDEA在某些情况下会发出“Field injection is not recommended”的警告。这是因为直接在字段上使用`@Autowired`虽然简洁,但并不符合最佳实践。本文将深入探讨这个问题,并提出解决策略。 首先,依赖注入有三...

    @Autowired报Field injection is not recommended的解决办法 - 副本.md

    @Autowired报Field injection is not recommended的解决办法 - 副本

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    在Spring框架中,依赖注入(Dependency Injection,DI)是一种核心特性,它允许我们解耦组件,使得代码更易于测试和维护。`@Autowired`和`@Bean`是两个关键注解,它们在实现DI时起着重要作用。让我们深入探讨这两个...

    (转)Spring中@Autowired注解和@Resource注解的区别

    在Spring框架中,`@Autowired`和`@Resource`注解是两个常见的依赖注入(DI, Dependency Injection)工具,它们都是用来解决组件之间的耦合问题,使得代码更加灵活和可测试。然而,这两个注解在具体使用时有一些关键性...

    Spring@Autowired注解与自动装配.rar

    在Spring框架中,`@Autowired`注解是一个关键特性,用于实现依赖注入(Dependency Injection,简称DI)。依赖注入是设计模式中的一个重要概念,它有助于降低组件之间的耦合度,提高代码的可测试性和可维护性。`@...

    Spring使用@Autowired注解自动装配

    在Spring框架中,`@Autowired`注解是一个关键特性,用于简化依赖注入的过程。依赖注入是一种设计模式,它允许我们解耦代码,提高模块的可测试性和可维护性。在这个主题中,我们将深入探讨`@Autowired`的工作原理、...

    Spring Ioc源码分析系列--@Autowired注解的实现原理.doc

    我们使用 @Autowired 注解将 UserService 注入到 ManagerService 中。 OURCE CODE ANALYSIS ------------------- 在我们的例子中,我们可以看到 AutowiredAnnotationBeanPostProcessor 是如何工作的。首先,它会对...

    @Autowired 注解是如何实现的?(csdn)————程序.pdf

    在Spring框架中,`@Autowired`注解是核心的依赖注入(Dependency Injection,DI)工具,它允许开发者自动地将Bean实例注入到需要的地方,无需显式地通过setter方法或构造函数来设置。在Java配置方式下,`@Autowired`...

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

    Intellij IDEA如何去掉@Autowired 注入警告的方法 在本篇文章中,我们将探讨如何在...去掉@Autowired 注入警告的方法可以使用构造器注入或Setter注入,避免使用Field注入,并使用Lombok提供的注解来简化我们的代码。

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

    Spring提供了多种方式来实现自动装配,其中之一就是使用@Autowired注解。 在Spring 2.5中引入了@Autowired注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。使用@Autowired可以消除set、get...

    Spring使用@Autowired为抽象父类注入依赖代码实例

    Spring框架中,使用@Autowired注解可以将依赖项注入到Bean中,但是当我们需要将依赖项注入到抽象父类时,会遇到一些问题。如果我们直接使用@Autowired注解在抽象父类中,可能不会生效,因为抽象父类不能被实例化。...

    SSH笔记-通过@Autowired配置注入关系

    在Spring框架中,`@Autowired`注解是一个关键特性,用于自动装配Bean的依赖。它极大地简化了传统XML配置中的bean依赖注入过程。本笔记将深入探讨如何在Spring 4中利用`@Autowired`注解配置注入关系,以及它与前一篇...

    【Java面试】@Resource 和 @Autowired 的区别.doc

    在使用 @Autowired 注解时,如果在 Spring IOC 容器里面存在多个相同类型的 Bean 实例,那么 Spring 启动的时候,会提示一个错误,大概意思原本只能注入一个单实例 Bean,但是在 IOC 容器里面却发现有多个,导致注入...

    spring autowired注解完整版

    @Autowired 注解是 Spring 框架中的一个重要特性,它出现在 Spring 2.5 版本中,用于简化依赖注入(Dependency Injection,简称 DI)的过程。DI 是一种设计模式,允许对象之间的依赖关系在运行时自动解决,使得代码...

    Spring注解@Resource和@Autowired.doc

    Spring 注解@Resource 和@Autowired Spring 框架中提供了两个重要的注解,分别是@Resource 和@Autowired,它们都是用于 bean 的自动装配的。了解这两个注解的区别和使用场景是非常重要的。 首先,@Autowired 是 ...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    在Spring框架中,`@Autowired`和`@Resource`都是用于自动装配Bean的重要注解,它们简化了依赖注入的过程,使得代码更加简洁、易于维护。本文将深入探讨这两个注解的使用、区别以及如何在实际开发中应用它们。 首先...

    学习Spring笔记_Annotation(注解)_Autowired_Qualifier

    Spring的核心特性之一是使用注解来简化配置,其中`@Autowired`和`@Qualifier`是两个关键的注解,它们在自动装配Bean时发挥着重要作用。这篇学习Spring笔记将深入探讨这两个注解的用法、原理以及它们在实际开发中的...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    Spring框架的@Autowired自动装配是其依赖注入(Dependency Injection, DI)机制的核心部分,它极大地简化了Java应用的组件装配和管理。本篇文章将深入探讨@Autowired的XML版本、Annotation版本以及源码层面的理解,...

    spring annotation注解

    Spring Annotation 注解 Spring 框架中的注解是用于在 Java 类中添加元数据的,通过这些元数据,Spring 框架可以在运行时提供更多的功能...在使用 @Autowired 注解时,需要注意其使用限制和注意事项,以确保正确使用。

    IntellijIDEA中MybatisMapper自动注入警告的6种解决方案.docx

    这种方式是 Spring 官方推荐的方式,原因详见《Why field injection is evil》。 总结:这 6 种解决方案都是可以解决 IntellijIDEA 中 MybatisMapper 自动注入警告的方法,每种方案都有其优缺点,开发者可以根据...

Global site tag (gtag.js) - Google Analytics