Spring依赖注入之构造方法注入、set方法注入以及基于字段的方式注入比较

2023-10-30

1、spring提供了三种依赖注入的方式,先来看一下各个注入方式的实现方法以及各自的优缺点

1)基于字段注入的方式

  该方式使用@Autowired方法就可以实现类的注入

@Component
public class ClassB {

    @Autowired
    private ClassA classA;

    public void testMethod1() {
        classA.method1();
    }
}

这种注入方式的优点就是实现简单,通过一个注解就可以完成注入。但是这样的弊端却有很多,是最不推荐的一种注入方式。

  1. 当ClassA没有被Spring管理时,则通过@Autowrite注解注入的ClassA则是null,此时调用A的方法会出现空指针异常。而且脱离了容器环境就不能够使用独立的使用ClassB中的ClassA对象,比如代码段:
    ClassB classB = new ClassB();
    classB.classA.method1();
    调用该代码就会出现空指针异常,这样就使得跟Spring框架强行绑定了,脱离框架无法使得代码正确运行
  2.  无法注入一个final类型的属性,这是由于final类型的字段必须在类实例化的时候进行实例化,而Spring的属性注入是在实例化完成之后通过AbstractAutowireCapableBeanFactory#populateBean方法进行属性填充的
  3. 第三点也是最容易忽略的一点,在存在循环依赖问题时,通过@Autowrite方式进行注入时,项目编译不会报错,但是调用循环依赖的方法时则会报错。所以@Autowrite方式不是解决了循环依赖的问题而是将问题隐藏了,这样更致命。 

 2)基于构造方法的方式进行注入

@Component
public class ClassB {

    private final ClassA classA;

    @Autowired
    public ClassB(ClassA classA) {
        this.classA = classA;
    }

    public void testMethod1() {
        classA.method1();
    }
}

通过对比上一种方法的缺点,我们看一下通过构造方法注入的优点。

  1. 通过构造方法注入可以脱离Spring框架使用注入的类,下面那段代码不会报空指针异常
    ClassB classB = new ClassB(new ClassA());
    classB.testMethod1();
  2.  可以注入final类型的属性,并且能够保证注入的属性都不为空
  3. 如果出现循环依赖的情况,通过该构造方法注入的方式注入的时候编译期间就会报异常
  4. 缺点就是如果注入的类比较多,或者有的类不是强制需要的时候就会增加构造方法的复杂度

3)set方法注入

@Component
public class ClassB {

    private ClassA classA;

    @Autowired
    public void setClassA(ClassA classA) {
        this.classA = classA;
    }

    public void testMethod1() {
        classA.method1();
    }
}
  1. 通过set方法进行注入的时候可以对依赖进行按需注入,避免了构造方法注入的时候许多依赖注入时候的问题
  2. set方法注入可以多次重复注入
  3. set方法注入不会发生循环依赖问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring依赖注入之构造方法注入、set方法注入以及基于字段的方式注入比较 的相关文章

  • 扩展 CrudRepository (Spring) 时是否需要 @Repository 注解?

    public interface CarRepository extends CrudRepository
  • 在记录活动中使用 readConfiguration 方法

    为了在小型 Java 桌面应用程序中使用日志记录 我试图深入了解一些方法的操作 我使用一个非常愚蠢的小Java程序来测试它们 特别是 在测试 LogManager readConfiguration 方法的行为时 我发现了一些奇怪的事情 在
  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • HQL - 分页的行标识符

    有谁知道HQL是否有一个关键字来标识行 例如ROWID或ROWNUM 我想使用 HQL 实现分页 但我无法使用 setMaxResult 或 setFirstResult 因为我不直接使用会话对象 因此不使用 Query 对象 而只是将查询
  • 问题:将大数据传递给第二个 Activity

    我有一个奇怪的问题 我在网上浏览但没有找到答案 我仍然是android编程的初学者 那么让我们开始吧 我想做的就是用一些数据调用第二个活动 它适用于小数据 但如果数据变大 第二个 Activity 将不会显示 第一个 Activity 将完
  • Java(正则表达式)-获取句子中的所有单词

    我需要将 java 字符串拆分为单词数组 假设该字符串是 Hi I need to split this string into a serie s of words 目前我正在尝试使用这个String strs str split w 但
  • 使用 Hibernate/Spring 生成数据库更新脚本

    我有一个项目 我们过去依赖 hibernate 来更新数据库 hibernate hbm2ddl auto update 即使在产品上 我正在将其迁移为使用 liquibase 我唯一担心的是 并不是我的团队中的每个人都是 sql 专家 因
  • Apache HttpClient 4.x 在上传较大文件时表现奇怪?

    我正在使用 java 和 scala 开发和测试一个简单的客户端 服务器应用程序 The server是基于com sun net httpserver HttpServer并允许使用 POST 和 PUT 操作通过基本的 RESTful
  • 我可以编写一个使用自动装配 Spring bean 的 Kotlin 扩展函数吗?

    我正在尝试创建一个扩展函数 其实现使用 Spring bean 通过在包的顶层定义扩展函数似乎不可能做到这一点 我试过这个 Component class Converter companion object Autowired latei
  • 识别包含本机方法实现的库文件/源

    如何识别包含本机方法实现的库文件 Ex public native String intern 我在哪里可以找到实施 source code of String intern 方法 找到了答案String intern 与快速谷歌搜索 ht
  • 如何更新 Websphere 7 以使用 EL2.2?

    这就是我所做的 按照此林肯 巴克斯特的帖子 http ocpsoft com java jsf2 java jsf2 how to add the magic of el el2 to jsf 我下载了 el api 2 2 jar 和 e
  • JRuby调用了错误的方法

    我在调用 Java 方法时遇到了一个奇怪的问题JRuby http en wikipedia org wiki JRuby 在我的 Java 类中 这些方法定义了两次 看来 JRuby 调用了错误的方法 所以我尝试使用java method
  • Java XPath API - 获取表示子树的字符串

    我的问题不是关于 xpath 语法 而是与 xpath 周围的 java API 有关 考虑以下 xml
  • Java - 动态创建子类

    我想以编程方式创建一个子类 我想我的选择很少 Javassist CGLib BCEL 或 ASM 用例是一个应用程序的内部是面向类的 而扩展是基于类的 因此 我不能将单个类作为由外部化脚本驱动的多个扩展的基础 现在 我该怎么做呢 我找到了
  • 在 libgdx 中截取屏幕截图

    我有一个应用程序 我想在其中截取游戏屏幕的屏幕截图并将其保存为图像并上传到 Facebook 我正在使用 Libgdx 我的重点是 android 谁能帮助我如何以编程方式截取游戏屏幕并将其另存为图像 现在相当容易 Libgdx提供了一个例
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • 从java类文件获取apache webcontents文件夹的绝对路径[重复]

    这个问题在这里已经有答案了 需要在动态 Web 应用程序内获取 java 类文件中的绝对路径 实际上我需要获取 apache webapps 文件夹的路径 部署 webapps 的位置 e g apache root webapps my
  • DocumentBuilder 解析产生无效字节 2 of 4 字节 UTF-8 序列错误

    我正在尝试解析包含字符串的字节数组Impresi n in XML final DocumentBuilderFactory builderFactory DocumentBuilderFactory newInstance final D
  • Tomcat 中 JNDI 的 Java Mail API 配置文档

    我花了几天时间弄清楚如何通过 JNDI 在 Tomcat 中配置 javax mail Session有认证 现在我明白了 但只是在深入研究代码之后 这次我看到了有史以来最糟糕的代码 javax mail Service connect S
  • JFrame.repaint() 和 JPanel.repaint() 之间的区别

    谁能解释一下两者之间的区别JPanel repaint 方法和JFrame repaint 方法 我想两者都调用paintComponent JPanel 中的方法 请澄清 谢谢 Calling repaint 在任何组件上都会向重绘管理器

随机推荐

  • 中国互联网上市科技公司市值蒸发了多少亿?

    科技公司的市值断崖路与程序员的应对救生服 跌 跌 跌 2018 抱团取暖的科技公司 2018 年 对于中国互联网上市科技公司来说 是跌宕起伏的一年 这一年的前半段 以腾讯 阿里为首的头部公司 风光无两 市值屡创新高 腾讯最高市值突破 500
  • JDK8主要新特性介绍(二)

    1 6 类库新特性 java util stream 类库包新特性 java util Optional 类新特性 java util Base64 类新特性 Java time 类新特性 其它常用类新增特性 HashMap类性能提升 1
  • 详解C++类&对象(上篇),带你走进C++

    目录 一 面向对象 面向过程的认识 简单了解即可 逐步认识 二 类 2 1 类的引入 2 2 类的定义 1 struct 2 class 类的两种定义方式 2 3 封装 类的访问限定符 1 封装概念 2 类的访问限定符 2 4 类的作用域
  • 三体攻击问题(三维数组的前缀和 与 差分)(上篇)

    三体攻击问题 文章目录 三体攻击问题 题目详情 前言 预备知识 二维差分与前缀和 三维前缀和 定义 官方解释 自定义 三维数组求前缀和 三维差分 官方解释 自定义 跟二维差分类比 三维查分的求解 总结 题目详情 三体人将对地球发起攻击 为了
  • MES系统总体介绍

    MES系统总体 系统目标 MES系统通过控制包括物料 设备 人员 流程指令和设施在内的所有工厂资源 优化从定单到产品完成的整个生产活动 以最少的投入生产出最优的产品 实现连续均衡生产 MES系统通过与ERP DCS系统的全面集成 为企业搭建
  • protobuf 使用

    protobuf 生成类 生成的类中包含各个字段的get和set接口 使用SerializeToString可将class实例转换为protobuf二进制数据 ParseFromArray函数可将protobuf二进制反序列化到类的实例中
  • 为之前的commit添加签名signoff

    Centos yum install gnupg Ubuntu apt install gpg windows 听我一句劝 乖乖去用wsl 生成gpg gpg gen key gpg K 列出私钥 gpg k 列出公钥 导出公钥 gpg a
  • 计算机毕设Python+Vue在线答题系统(程序+LW+部署)

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • Java第一次做项目学到技巧和知识

    第一个 定义项目return 在定义项目返回值的时候 可以利用泛型 Data public class R
  • python 猜数字游戏

    随机生成1 100的一个数 给7次猜的机会 猜对了或者7次都猜错了游戏结束 并弹出是否再来一次 每猜一次 给出提示High或者Low 并给出下次再猜的数字范围 guess number game import random def gues
  • Java怎么连接数据库 (使用技术及步骤原理,入门即会)

    文章说明 我们在这里讨论怎么去使用 了解它基本内容 认真看完 你就会了 连接时需要在 eclipse idea 加入它所需要的 jar包 依赖 下面讲为什么 你可以从网盘下载 也可以去官网搜索 下载所需的版本 链接 https pan ba
  • springboot返回object自动json转换以及fastjson转json时大写key转换问题

    springboot返回object自动json转换以及fastjson转json时大写key转换问题 当然 我们为了让用户更加便捷 我们增加了图片拖拽功能 项目的实体类中有一个LAY CHECKED An highlighted bloc
  • 验证邮箱地址的有效性javascript

    function isEmail email if email alert 邮箱不能为空 else if email split length 1 email split length 1 alert 邮箱地址必须包含 和 else let
  • 从 Salesforce 与 Veeva 合作历程,浅谈垂直型SaaS的初创及发展思路

    近日 相关传言称 美国最大客户关系管理SaaS供应商Salesforce中国区宣布解散 瞬间成为业内探讨热点 有媒体报道 Salesforce此举并非 退出中国市场 而是将中国区业务交给阿里云作为总代理 其相关产品依旧可以正常运作 Sale
  • Access Token 访问令牌 的获取与使用

    一 引用 三方库导入时 通常需要输入账号和令牌进行鉴权 账号为指定平台的 HTTP 克隆账号 访问令牌即 Access Token 本文介绍如何获取常见三方代码平台的Access Token Access Token 通常在代码平台的个人账
  • Spring Data JPA简介

    Spring Data JPA介绍 可以理解为JPA规范的再次封装抽象 底层还是使用了Hibernate的JPA技术实现 引用JPQL Java Persistence Query Language 查询语言 属于Spring整个生态体系的
  • 程序的二进制布局

    真正的程序员对自己所写的程序的每个字节都有所把握 虽然用一些OOP语言进行开发时 我们几乎不可能做到这一点 但我们还是应该对我们程序的二进制布局有个整体把握 在Linux环境中 无论是可重定位文件 o 共享目标文件 so 还是可执行文件都属
  • 一些有的没得小知识

    1 空间函数 st distance sphere st distance 计算距离 2 Stream流将List转Map 3 批量连表更新 1 空间函数 st distance sphere st distance 计算距离 st dis
  • Vision Transformers for Dense Prediction--阅读阶段

    论文相关申明 论文地址 article Ranftl2021 author Ren e Ranftl and Alexey Bochkovskiy and Vladlen Koltun title Vision Transformers f
  • Spring依赖注入之构造方法注入、set方法注入以及基于字段的方式注入比较

    1 spring提供了三种依赖注入的方式 先来看一下各个注入方式的实现方法以及各自的优缺点 1 基于字段注入的方式 该方式使用 Autowired方法就可以实现类的注入 Component public class ClassB Autow