field injection is not recommended 的解决办法

问题概述

在项目开发过程中,使用基于字段变量的依赖注入(通过注解@Autowired进行注入)时(据大部分人在通常情况下都是使用@Autowired进行注入操作的)出现一个黄色警告下划线,提示 “ field injection is not recommended ”,作为一个现代的老码畜也看得很不爽,如下图:

 

解决办法

首先,我们需要了解三种常用的依赖注入方式:

基于构造器的依赖注入
基于Setter的依赖注入
基于字段变量的依赖注入

(当然还有其它不常用的注入方式:静态工厂方法注入、动态工厂方法注入)

 

各个依赖注入的实现方式:

构造器注入:

    private final InventoryMapper inventoryMapper;

    public InventoryController(InventoryMapper inventoryMapper) {
        this.inventoryMapper = inventoryMapper;
    }

 

Setter注入:

    private InventoryMapper inventoryMapper;

    public void setInventoryMapper(InventoryMapper inventoryMapper) {
        this.inventoryMapper = inventoryMapper;
    }

 

字段变量注入:

字段变量注入是基于注解实现的,即@Resource或者@Autowired,

    @Autowired
    private InventoryMapper inventoryMapper;

 

@Autowired:表示自动注入,自动从spring的上下文找到合适的bean来注入

@Resource:表示按指定名称注入,@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。 当然,还可以为 @Service和@Resource 添加 name 这个属性来区分不同的实现。

@Component:表示一种泛指,被标记类即组件,Spring扫描注解配置时,会标记这些类要生成对应的bean。

@Qualifier和@Autowired配合使用,当一个接口有多个实现的时候,@Qualifier的value定了具体调用哪个类的实现(需要在实现类中通过@Service来表示每个不同的bean),也就是说指定了注入bean的名称。

Controller、Service、、Repository分别作用类是控制层类、业务层类、数据访问层类,Spring扫描注解配置时,会标记这些类要生成对应的bean。

@Autowired和@Resource是用来修饰字段,构造函数,或者方法,其作用是注入bean。而@Service,@Controller,@Repository,@Component则是用来修饰类,标记这些类要生成bean。

 

基于字段变量的依赖注入:

优点:基于字段变量的依赖注入方式非常简洁,没有任何多余代码,有效的提高了Java的简洁性。

缺点:不能指明具体的依赖。可能会遇见依赖注入的对象为null,所以这种方式过于依赖注入容器,当没有启动整个依赖容器时,这个类就不能运转,在反射时无法提供这个类需要的依赖。


如果使用基于Setter的依赖注入方式,它是一种选择性注入,可有可无的,即使没有注入这个依赖,也不会影响整个项目的运行。
如果基于构造器的依赖注入方式,它是一种强制性的,显示的注入。通过显示指明依赖注入来保证整个项目的运行。


对依赖注入的理解:
首先了解关于注入的两个概念IOC(控制反转)和DI(依赖注入),简单的说,IoC是一种思想,而DI则是一种行为。也可以说IoC是目的,DI是手段。IoC是指让生成类的方式由传统方式(new)反过来,开发程序时不需要调用new,当需要使用某个类的时候由框架来注入(DI)即可。

 

好了,上面关于依赖注入的知识就介绍到这儿吧,回归到问题!

关于 “ field injection is not recommended  ” 这个问题,其实不影响使用的,可以不必理会,

 

Spring 官方使用的注解方式:

 

 

如果只想代码简洁,只想使用@Autowired基于字段变量的依赖注入

终极解决办法:

Settings->Editor->Inspections->Spring->Spring Core->Core->Field Injection warning将Severity属性值改为 “ No highlighting,only fix ” 如下图:

修改完成后,如下图:

 

 

 

 

 

参考文献:

spring-framework5.3.4docs

spring-guides


 好了,关于 field injection is not recommended 的解决办法  就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:CSDN (Chinese Software Developer Network)
原        文:https://blog.csdn.net/Hello_World_QWP/article/details/116119502
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
  • 96
    点赞
  • 183
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
Dependency Injection(依赖注入)是一种软件设计模式,用于解耦应用程序中的组件之间的依赖关系。它可以使代码更加灵活、可维护、可测试和可扩展。 在传统的编程模式中,每个组件都需要自行创建和管理它所依赖的对象。这种方式会导致代码紧密耦合,难以进行单元测试,也不利于代码的扩展和维护。而依赖注入则通过将组件所依赖的对象的创建和管理权交给外部容器来实现解耦。 依赖注入主要有三种实现方式: 1. 构造函数注入(Constructor Injection) 这种方式是通过组件的构造函数来注入所依赖的对象。例如: ```python class ComponentA: def __init__(self, component_b): self.component_b = component_b ``` 在这个例子中,ComponentA 类的构造函数需要一个 ComponentB 类的实例作为参数。这就意味着,创建 ComponentA 类的实例时,必须先创建一个 ComponentB 类的实例,并将其传递给 ComponentA 类的构造函数。 2. 属性注入(Property Injection) 这种方式是通过组件的属性来注入所依赖的对象。例如: ```python class ComponentA: def __init__(self): self.component_b = None ``` 在这个例子中,ComponentA 类的构造函数不需要任何参数,但是它包含了一个名为 component_b 的属性。在创建 ComponentA 类的实例之后,可以通过属性注入来设置 component_b 属性的值: ```python component_a = ComponentA() component_b = ComponentB() component_a.component_b = component_b ``` 3. 方法注入(Method Injection) 这种方式是通过组件的方法来注入所依赖的对象。例如: ```python class ComponentA: def set_component_b(self, component_b): self.component_b = component_b ``` 在这个例子中,ComponentA 类包含了一个名为 set_component_b 的方法,该方法接受一个 ComponentB 类的实例作为参数,并将其存储在 component_b 属性中。在创建 ComponentA 类的实例之后,可以通过方法注入来设置 component_b 属性的值: ```python component_a = ComponentA() component_b = ComponentB() component_a.set_component_b(component_b) ``` 总之,无论是使用构造函数注入、属性注入还是方法注入,依赖注入都可以将组件之间的依赖关系解耦,从而实现更加灵活、可维护、可测试和可扩展的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值