@Autowired的使用:推荐对构造函数进行注释

2023-11-01

  Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

  翻译:
    Spring建议”总是在您的bean中使用构造函数建立依赖注入。总是使用断言强制依赖”。

 

这段代码警告原来的写法是:

@Autowired
private EnterpriseDbService service;


建议后写成下面的样子:

private final EnterpriseDbService service;

@Autowired
public EnterpriseDbController(EnterpriseDbService service) {
   this.service = service;
}

 

  奇怪,为何会有这样的建议。

  我们知道:@Autowired 可以对成员变量、方法以及构造函数进行注释。那么对成员变量和构造函数进行注释又有什么区别呢?

  @Autowired注入bean,相当于在配置文件中配置bean,并且使用setter注入。而对构造函数进行注释,就相当于是使用构造函数进行依赖注入了吧。莫非是这两种注入方法的不同。

 


  以下是:@Autowired和构造方法执行的顺序解析

  先看一段代码,下面的代码能运行成功吗?
 

1 @Autowired
2 private User user;
3 private String school;
4 
5 public UserAccountServiceImpl(){
6     this.school = user.getSchool();
7 }


  答案是不能。

  因为Java类会先执行构造方法,然后再给注解了@Autowired 的user注入值,所以在执行构造方法的时候,就会报错。

  报错信息可能会像下面:
  Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...' defined in file [....class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [...]: Constructor threw exception; nested exception is java.lang.NullPointerException
  报错信息说:创建Bean时出错,出错原因是实例化bean失败,因为bean时构造方法出错,在构造方法里抛出了空指针异常。

  解决办法是,使用构造器注入,如下:

1 private User user;
2 private String school;
3 
4 @Autowired
5 public UserAccountServiceImpl(User user){
6     this.user = user;
7     this.school = user.getSchool();
8 }

  可以看出,使用构造器注入的方法,可以明确成员变量的加载顺序

PS:Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired

  转载来源:http://blog.csdn.net/ruangong1203/article/details/50992147


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Autowired的使用:推荐对构造函数进行注释 的相关文章

随机推荐

  • java设计模式——观察者模式(Observer Pattern)

    概述 观察者模式是使用频率最高的设计模式之一 它用于建立一种对象与对象之间的依赖关系 一个对象发生改变时将自动通知其他对象 其他对象将相应作出反应 在观察者模式中 发生改变的对象称为观察目标 而被通知的对象称为观察者 一个观察目标可以对应多
  • [Linux用户空间编程-3]:Linux定时机制的几种实现方法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123376014 目录 前言 定时器的
  • 服务器查看内存条的参数信息,怎么查看服务器内存参数

    怎么查看服务器内存参数 内容精选 换一换 当您发现云服务器的运行速度变慢或云服务器突然出现网络断开现象 则可能是云服务器的带宽和CPU使用率过高导致 如果您已经通过云监控服务创建过告警任务 当CPU或带宽利用率高时 系统会自动发送告警给您
  • 《Head First HTML5 javascript》第9章 认识对象

    2022 11 21 第9章 认识对象 对象 对象是一个包含相关数据和方法的集合 通常由一些变量和函数组成 我们称之为对象里面的属性和方法 对象是存储在单个分组中的相关功能的集合 在 JavaScript 中 大多数事物都是对象 从作为核心
  • 西米支付:支付宝/微信支付/银联支付通道的接入介绍

    本文以电脑网站支付为例 着重对第三方支付通道的接入进行了分析 包括支付宝支付接入 微信支付接入及银联支付接入 1 支付宝支付接入 支付宝支付能力主要有当面付 刷脸付 App支付 手机网站支付 电脑网站支付和花呗分期等 本文采用电脑网站支付实
  • 手机远程唤醒 android,手机微信实现网络唤醒电脑(WOL),远程开机,WakeOnLan – 全栈笔记...

    一 需求分析 我的电脑一般都是24小时候开机的 方便远程操作 但是这样 一是比较浪费电 二是对电脑硬件也或多或少有些影响 所以就需要远程开机 目前远程开机有很多种方式 1 智能插线板 可以远程控制插板的通电和断电 并在BIOS中设置来电开机
  • No.6 907. 子数组的最小值之和(python)

    给定一个整数数组 arr 找到 min b 的总和 其中 b 的范围为 arr 的每个 连续 子数组 由于答案可能很大 因此 返回答案模 10 9 7 示例 1 输入 arr 3 1 2 4 输出 17 解释 子数组为 3 1 2 4 3
  • B站快捷键-切换上一集,切换下一集

    切换上一集 快捷键 切换下一集 快捷键
  • Linux平台卸载MySQL总结

    如何在Linux下卸载MySQL数据库呢 下面总结 整理了一下Linux平台下卸载MySQL的方法 MySQL的安装主要有三种方式 二进制包安装 Using Generic Binaries RPM包安装 源码安装 对应不同的安装方式 卸载
  • Vue 引入 icon 图标

    安装 npm install vue svg icon save dev 使用 1 阿里巴巴矢量图 选择需要的字体修改参数 选择SVG下载 2 IcoMoon 点击右上角 icoMoon App 点击左上角 Import Icons 选择下
  • 【FICO系列】SAP 创建会计凭证(FB01)的BAPI

    公众号 SAP Technical 本文作者 matinal 原文出处 http www cnblogs com SAPmatinal 原文链接 FICO系列 SAP 创建会计凭证 FB01 的BAPI 前言部分 大家可以关注我的公众号 公
  • TCP+UDP通信实验

    一 实验要求 1 基于服务器的客户端相互直接通信 具体要求包括 2 Server支持多客户访问 3 C与S之间使用TCP连接 4 C与C之间直接通信 不是通过S传递 5 C与C之间直接通信既可以使用TCP 也可以使用UDP 6 可以使用So
  • 放弃手中Docker拥抱下一代容器管理工具Podman

    关注 WeiyiGeek 公众号 将我设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 0x00 基础介绍 前生今世 0x01 安装试用 Ubuntu Podman 命令 容器管理工具 0x02 小试牛刀 1 Podma
  • 进程和线程的深入理解

    进程和线程的深入理解 下面是抽象类比 单CPU 一台单核处理器计算机 一个车间 多CPU 一台多核处理器计算机 一座工厂 进程 一个车间 一个进程 即一个运行的程序 多进程 一座工厂可以同时运行多个车间 CPU和进程 单CPU只能同时运行单
  • XSS、SSRF、CSRF、XXE 漏洞的区别

    XSS 跨站脚本攻击 XSS属于客户端攻击 受害者最终是用户 但特别要注意的是网站管理员也属于用户之一 这就意味着XSS可以进行 服务端 攻击 因为管理员要比普通用户的权限大得多 一般管理员都可以对网站进行文件管理 数据管理等操作 而攻击者
  • CTF赛制介绍&工具介绍

    CTF基本赛制与题型 语言环境的安装 常见工具的简介与安装 什么是CTF CTF Capture The Flag 中文一般译作夺旗赛 在 网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCO
  • 解决‘pip‘ 不是内部或外部命令,也不是可运行的程序或批处理文件

    python开发安装第三方库时 很多人选择在cmd终端用命令行pip进行安装 然而有时敲入pip命令会提示 pip 不是内部或外部命令 也不是可运行的程序 或批处理文件 为何会出现此类问题呢 一般都是因为系统环境变量没有配置好 推荐链接 电
  • Educational Codeforces Round 113 (Rated for Div. 2)

    A Balanced Substring 题意 字符串 s 由字符 a 和 b 构成 寻找 s 的子串 s l r 使得子串中字符 a 和 b 的数量相同 输出 l r 思路 范围很小 暴力解决 求出 s 子串 s 0 i 中字符 a 和
  • 线性代数——正交矩阵

    正交矩阵 orthogonal matrix 正交矩阵的定义 正交矩阵性质 1 AT是正交矩阵 2 A的各行是单位向量且两两正交 3 A的各列是单位向量且两两正交 4 A 1或 1 正交矩阵的定义 如果 AAT E E为单位矩阵 AT表示
  • @Autowired的使用:推荐对构造函数进行注释

    在编写代码的时候 使用 Autowired注解是 发现IDE报的一个警告 如下 Spring Team recommends Always use constructor based dependency injection in your