CTO 说了,用错@Autowired 和@Resource 的人可以领盒饭了

workbench 流固耦合_基于ANSYS 2019R1全解一款双吸泵的双向流固耦合方法 一、导读对于旋转机械来说,传统设计从理论计算到手工木模图,再到模型泵的加工制造,最后进行相关性能试验。当性能试验与预期效果差距较大的时候还需要修改水力模型。这种传统的设计不仅设计周期长,而且成本也高,在没有成熟的水力模型参考的情况下做设计风险也较大。而日益强大的CFD技术为旋转机械行业的发展提供了非常有力的工具。大量工程实践证明像CFX、Fluent以及Pumplinx等流产分析软件具有较高的计算... 阅读详情

来源:https://juejin.cn/post/6844904064212271117

介绍

今天使用Idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代码?

@Autowire
private JdbcTemplate jdbcTemplate;

提示的警告信息

Field injection is not recommended Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

这段是Spring工作组的建议,大致翻译一下:

属性字段注入的方式不推荐,检查到的问题是:Spring团队建议:"始终在bean中使用基于构造函数的依赖项注入,始终对强制性依赖项使用断言"

如图

ad3577beff05705d5eecb2bddcb2a587.png Field注入警告

注入方式

虽然当前有关Spring Framework(5.0.3)的文档仅定义了两种主要的注入类型,但实际上有三种:

基于构造函数的依赖注入

public class UserServiceImpl implents UserService{
    private UserDao userDao;
    
    @Autowire
    public UserServiceImpl(UserDao userDao){
        this.userDao = userDao;
    }
}

基于Setter的依赖注入

public class UserServiceImpl implents UserService{
     private UserDao userDao;
     
     @Autowire
     public serUserDao(UserDao userDao){
         this.userDao = userDao;
     }
 }

基于字段的依赖注入

public class UserServiceImpl implents UserService{
     @Autowire
     private UserDao userDao;
 }

基于字段的依赖注入方式会在Idea当中吃到黄牌警告,但是这种使用方式使用的也最广泛,因为简洁方便.您甚至可以在一些Spring指南中看到这种注入方法,尽管在文档中不建议这样做.(有点执法犯法的感觉)

如图

f56c1d9ce447e97e41ca96692cfeb10b.png Spring自己的文档

基于字段的依赖注入缺点

对于有final修饰的变量不好使

Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式

掩盖单一职责的设计思想

我们都知道在OOP的设计当中有一个单一职责思想,如果你采用的是基于构造函数的依赖注入的方式来使用Spring的IOC的时候,当你注入的太多的时候,这个构造方法的参数就会很庞大,类似于下面.

当你看到这个类的构造方法那么多参数的时候,你自然而然的会想一下:这个类是不是违反了单一职责思想?.但是使用基于字段的依赖注入不会让你察觉,你会很沉浸在@Autowire当中

public class VerifyServiceImpl implents VerifyService{
    
  private AccountService accountService;
  private UserService userService;
  private IDService idService;
  private RoleService roleService;
  private PermissionService permissionService;
  private EnterpriseService enterpriseService;
  private EmployeeService employService;
  private TaskService taskService;
  private RedisService redisService;
  private MQService mqService;

  public SystemLogDto(AccountService accountService, 
                      UserService userService, 
                      IDService idService, 
                      RoleService roleService, 
                      PermissionService permissionService, 
                      EnterpriseService enterpriseService, 
                      EmployeeService employService, 
                      TaskService taskService, 
                      RedisService redisService, 
                      MQService mqService) {
      this.accountService = accountService;
      this.userService = userService;
      this.idService = idService;
      this.roleService = roleService;
      this.permissionService = permissionService;
      this.enterpriseService = enterpriseService;
      this.employService = employService;
      this.taskService = taskService;
      this.redisService = redisService;
      this.mqService = mqService;
  }
}

与Spring的IOC机制紧密耦合

当你使用基于字段的依赖注入方式的时候,确实可以省略构造方法和setter这些个模板类型的方法,但是,你把控制权全给Spring的IOC了,别的类想重新设置下你的某个注入属性,没法处理(当然反射可以做到).

本身Spring的目的就是解藕和依赖反转,结果通过再次与类注入器(在本例中为Spring)耦合,失去了通过自动装配类字段而实现的对类的解耦,从而使类在Spring容器之外无效.

隐藏依赖性

当你使用Spring的IOC的时候,被注入的类应当使用一些public类型(构造方法,和setter类型方法)的方法来向外界表达:我需要什么依赖.但是基于字段的依赖注入的方式,基本都是private形式的,private把属性都给封印到class当中了.

无法对注入的属性进行安检

基于字段的依赖注入方式,你在程序启动的时候无法拿到这个类,只有在真正的业务使用的时候才会拿到,一般情况下,这个注入的都是非null的,万一要是null怎么办,在业务处理的时候错误才爆出来,时间有点晚了,如果在启动的时候就暴露出来,那么bug就可以很快得到修复(当然你可以加注解校验).

如果你想在属性注入的时候,想根据这个注入的对象操作点东西,你无法办到.我碰到过的例子:一些配置信息啊,有些人总是会配错误,等到了自己测试业务阶段才知道配错了,例如线程初始个数不小心配置成了3000,机器真的是狂叫啊!这个时候就需要再某些Value注入的时候做一个检测机制.

结论

通过上面,我们可以看到,基于字段的依赖注入方式有很多缺点,我们应当避免使用基于字段的依赖注入.推荐的方法是使用基于构造函数和基于setter的依赖注入.对于必需的依赖项,建议使用基于构造函数的注入,以使它们成为不可变的,并防止它们为null。对于可选的依赖项,建议使用基于Setter的注入

后记

翻译自field-injection-is-not-recommended,加入了自己的白话理解!

【即插即用模块】注意力篇 | TIP 2024 | 注意力机制的有效改进!内容引导注意力块CGA,空间-通道-像素三个维度融合,实现涨点! CGA(Content-Guided Attention)是一种融合多维度注意力的即插即用模块,通过并联空间和通道注意力并与像素注意力串联,实现从通道、空间到像素的三层级特征筛选。该模块采用层级递进设计,解决了传统单维度注意力的局限性,尤其适用于图像恢复等对特征精度要求高的任务。实验表明,CGA在去雾任务中能显著提升指标,但会略微增加参数量。模块代码支持灵活集成到各类视觉模型中,建议放置在网络靠前位置以充分释放后续层性能。其核心创新在于通过7×7大卷积捕捉长距离依赖,结合分组卷积实现像素级细粒度建模 阅读详情

相关推荐

关于光耦隔离与SP3485E芯片一起使用无法拉高485使能引脚问题

最近在做的一个项目,定制了一块STM32F407ZG的工控板,工控板载4个485接口全部都是只能接收数据,不能对外发送数据。1.接线不正确:接线不正确导致485收发出现问题。 2.程序端口初始化问题:控制光耦隔离的输入脚IO的初始化和置位状态有问题。 3.GPIO复用问题:控制对应串口的GPIO不是正点原子默认的GPIO,而是经过复用的其他IO,复用问题。 4.程序设置与485E芯片收发模式不对应:对于使能引脚的电平要根据光耦的输出情况确定输入IO与RE的关系,可能模式没有对应。 5.光耦隔离或者SP485

weixin_45862642的博客 2978

SpringBoot测试类插入数据出错because “this.service“ is null

3. Test类的扫描路径不对:默认情况下,SpringBoot 在扫描测试类时会默认扫描与主类相同包路径的类。如果你的 Service 类放在了其他包路径下,那么你就需要在测试类中指定这个路径。2. Service类的命名不正确:确保你的 Service 类的命名符合规范,以及在测试类中正确地注入了 Service 类的实例。4. 代码中的逻辑错误:除此之外,还有可能是你的测试代码出现了逻辑错误。3. 如果注入方式没有问题,就要检查其他可能出错的点,比如包路径是否正确,代码逻辑是否有误。

weixin_46330530的博客 3062

AI大模型驱动的智能座舱研发体系重构

AI大模型正重构智能座舱研发体系的核心逻辑,需以场景认知为起点、混合架构为支柱、AI原生生态为落脚点。未来,研发体系需持续融合认知科学、边缘计算与开放生态理论,推动座舱从“工具”进化为“伙伴”。

我的专栏 1917

@Autowire和@Resource注解使用的正确姿势,别再用错的了!!

作者:liuxuzxxjuejin.cn/post/6844904064212271117介绍今天使用Idea写代码的时候,看到之前的项目中显示有warning的提示,去看了下,是如下代...

java思维导图 144

1.1.4 运用防火墙实现入侵防御

摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)

Ljs040411的博客 2135

一篇文章认识《双目立体视觉》

双目立体视觉,由两个摄像头组成,像人的眼睛能看到三维的物体,具有深度的信息;单目视觉只能看到二维的物体。 1)双目摄像头 2)双目相机基线 3)打开双目摄像头 4)双目测距 视差disparity、 极线约束、 极线校正/立体校正、 a.双目标定 b.双目矫正 c.立体匹配 d.双目测距(三角测量) e.测距效果 立体视觉方法评测网站

黎国溥 7964

spring系列之-使用@Autowired注解,出现提示信息Field injection is not recommended

一、出现提示信息“不推荐使用变量注入方式”如下图。 spring团队建议:始终在bean中使用基于构造函数的依赖注入。始终对强制性依赖使用断言。 思考:为什么不推荐使用,这种方式是不是有更好的替代方案。于是自己查了一下网上的资料做个总结。 二、依赖注入有三种方式: 变量(filed)注入 构造器注入 set方法注入 变量注入这种方式是我们用的比较多的,下面我们来对比一下这几...

weinichendian的博客 1258

手把手教你学Simulink--基于光伏(PV)系统的建模与仿真场景:-不同天气条件下光伏系统的输出性能分析

本文介绍了使用Simulink和Simscape Electrical工具箱进行光伏系统建模与仿真的完整流程。内容涵盖准备工作、模型构建、仿真分析三大步骤,重点演示了如何模拟不同天气条件(光照强度、温度变化)对光伏输出性能的影响。通过添加PVArray模块、配置参数、设置环境变化条件、连接测量仪器等操作,实现了光伏系统在动态天气条件下的输出特性分析。文章还提供了仿真参数设置建议和结果分析方法,帮助用户理解环境因素与光伏性能的关联性,为光伏系统设计和优化提供参考。

MHD0815的博客 189

Spring中使用构造函数进行依赖注入

基于构造函数的依赖注入: 使用的标签:constructor-arg 标签出现的位置:bean标签的内部 标签的属性: type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型。 index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始。 name:用于指定给构造函数中指定名称的参数赋值。(常用) value:用于提供基本类型和Str...

... 837

7.1华为OD机试真题 新系统 - 奇偶三数之和 (Java/Py/C/C++/Js/Go)

7.1华为OD机试真题 新系统 - 奇偶三数之和 (Java/Py/C/C++/Js/Go)

算法大师! 451

JavaScript教程-字符集,Unicode转义序列,标识符,数据类型,数字,未定义值,浮点数,字符串,引用数据类型,类型检测,类型转换,运算符,关系运算符,

前端学习

VAN 213

CTO 说了,用错 @Autowired 和 @Resource 的人可以领盒饭了

这段是Spring工作组的建议,大致翻译一下:属性字段注入的方式不推荐,检查到的问题是:Spring团队建议:“始终在bean中使用基于构造函数的依赖项注入,始终对强制性依赖项使用断言”Field注入警告。

2401_85147537的博客 820

【深度学习新浪潮】AI 智能眼镜关键视觉技术、技术栈及开源项目全解析

Meta新款智能眼镜在演示中暴露出的AI误判和延迟问题,揭示了端侧视觉与多模态算法落地的核心瓶颈。本文从算法工程视角解析了AI智能眼镜的三大关键技术:感知增强(多帧降噪、HDR成像)、场景解析(轻量化目标检测、语义分割)和空间定位(视觉SLAM、ToF辅助),并梳理了完整的技术栈架构,包括硬件适配、驱动优化和框架选型。文章还提供了高价值开源项目参考,如OpenXR和ORB-SLAM3,为端侧视觉算法落地提供实操指南,助力开发者攻克算力约束下的实时性、精度和功耗平衡难题。

专注:太空算力、AI infra、异构调度、大模型成本工程 530
上一篇: 阿里二面:main 方法可以继承吗?
下一篇: 没想到Spring Boot + Vue 竟如此简单!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值