结构体注入VS setter 注入

2023-10-29

结构体注入,setter注入是比较常用的依赖注入方式,都有各自的优缺点。setter注入是Spring推荐的依赖注入方式。

首先结构体注入有什么问题?

1. 不能重新配置和重新注入

在Spring参考文档 中基于结构体注入和setter注入有以下陈述:
Spring团队通常主张使用setter注入,因为大量的的结构体参数可能会使结构体变得笨重,特别是有些属性是可选的时候。相反setter注入可使对象在以后进行重新配置和重新注入。JMX管理MBean便是一个很好的例子。
一些纯粹主义者喜欢基于结构体注入。在实例化对象时提供所有对象依赖关系,这意味着对象总是以完全初始化的状态返回个客户端。缺点是对象变得不太适合重新配置和注入。
有时,在处理没有源代码的第三方类时,遗留的类可能不会公开任何setter方法,所以结构体注入是唯一可用的注入方式。因此,在没有sette存在的情况下,使用结构体注入,结构体注入不能通过正注入行的依赖项来重行配置构造的bean.如果需要重行配置bean,则必须使用新的依赖关系构建新的bean实例,并丢弃另一个。

2.循环依赖
Spring参考文档关于循环依赖有如下陈述:
如果主要使用结构体注入,则可能创建爱你一个无法解决的循环依赖的情况。
例如类A实例化时需要一个B实例,B实例化时需要一个A实例。如果将类A和B的bean配置为彼此注入,则Spirng Ioc 容器会在运行时检测此循环引用,并抛出一个BeanCurrentlyInCreationException。
一个可能的解决方案是编辑某些类的源代码通过setter注入而不是构造函数注入。或者,避免构造器注入和仅使用setter注入。换句话说,虽然不推荐,您可以使用setter注入来配置循环依赖关系.
与典型的情况(没有循环依赖)不同,bean A和bean B之间的循环依赖关系强制其中一个bean在被完全初始化之前被注入另一个bean(一个经典的鸡/鸡蛋场景)

需要注意的是setter注入也是一样的。当你有一个凌乱的构造函数或很多设置器,这意味着你的类设计和你的关注点是错误的。可能,您需要将一些行为重构到一个单独的类中。顺便说一下,字段注入会导致单元测试变得更加困难。使用构造函数或setter注入,您可以从单元测试中定义依赖关系,并将其传递给构造函数或setter方法。
结机构提注入用于强制性依赖关系和setter是可选注入,但是要确保构造函数不会乱成一团,也不会导致大量setter的出现。如果是这样的话,请注意分离关注点。

原文链接https://steveschols.wordpress.com/2012/06/05/i-was-wrong-constructor-vs-setter-injection/

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

结构体注入VS setter 注入 的相关文章

随机推荐

  • java总结(不断更新)

    总结一句话 基础很重要 记得时而复习之 一轮人事 人事初步了解情况并推给技术部 二轮技术部 技术部电话面试 三轮面试技术以及对应客户 面试情况如下 自我介绍 项目经历 碰到的技术难点 java某个类的使用情况 字符串 长短值 类的加载机制
  • swagger-02-配置swagger

    1 4 配置swagger package com example config import org springframework context annotation Bean import org springframework c
  • Android UI 模板

    简单学习了Android UI 模板 自定义的UI模板 在自己设计的app中可以进行有效的代码复用 在这里做个流程整理 之后再添加漂亮的效果 首先加个在线阅读Android 源码的链接 点击打开链接 花个时间阅读一下系统的封装方法对学习An
  • 基于SSM框架的百货中心供应链管理系统

    社会发展日新月异 用计算机应用实现数据管理功能已经算是很完善的了 但是随着移动互联网的到来 处理信息不再受制于地理位置的限制 处理信息及时高效 备受人们的喜爱 本次开发一套百货中心供应链管理系统有管理员 人事 财务 销售 采购 服务六个角色
  • 突破对银河系的传统认知 大量超高能宇宙加速器被发现

    宇宙无限 信使有痕 5月17日 国家重大科技基础设施 高海拔宇宙线观测站 LHAASO 公布在银河系内发现大量超高能宇宙加速器 并记录到能量达1 4拍电子伏的伽马光子 拍 千万亿 这是人类观测到的最高能量光子 突破了人类对银河系粒子加速的传
  • C# 实现生成一维码、二维码

    注意 需要使用以下库文件 using ThoughtWorks QRCode Codec using ZXing using ZXing Common using ZXing QrCode 具体实现如下所示 帮助类一 using Syste
  • ES学习——ES评分简单介绍

    当我们能使用match来搜索匹配数据的时候 es会给每一个文档进行评分 匹配度 并根据评分的大小对结果文档进行排序 介绍 es的实时评分机制是基于 Lucene 的基础上实现的 最常见的是 TF IDF和BM25这两种评分模型 TF IDF
  • ElasticSearch配置

    2 搭建ElasticSearch环境 2 1 拉取镜像 docker pull elasticsearch 7 4 0 2 2 创建容器 docker run id name elasticsearch d restart always
  • JavaScript和jQuery的基础知识和使用

    初识JavaScript 首先对于JavaScript和Java两种语言 除了语法和Java有些类似 其他部分没有任何关系 由于当时Java很火 为了推广才在名字中加了Java 也就是所谓的蹭热度 另外 与JavaScript共同提起的还有
  • ModuleNotFoundError: No module named ‘forms‘

    问题 导入自定模块的时候报错 找不到模块 解决办法 将导入模块的代码写在靠近应用该模块的地方
  • MPLS实验

    MPLS第一次试验 公网地址配置 R2 GigabitEthernet0 0 1 23 1 1 1 24 LoopBack0 2 2 2 2 24 R3 GigabitEthernet0 0 0 23 1 1 2 24 GigabitEth
  • C语言文件读入---跳过第一行和最后一行

    include
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • Android Fragment 生命周期图

    http www cnblogs com purediy p 3276545 html
  • 开发技术--浅谈python数据类型

    开发 浅谈python数据类型 在回顾Python基础的时候 遇到最大的问题就是内容很多 而我的目的是回顾自己之前学习的内容 进行相应的总结 所以我就不玩基础了 很多在我实际生活中使用的东西 我会在文章中提一下 并且我自己会根据这些内容进行
  • C++从入门到放弃之:Hello.cpp

    C 从入门到放弃 Hello cpp 1 创建c 程序源代码 2 C 程序的编译 3 C 扩展名 4 C 头文件 5 C 输入输出流 Hello cpp 1 创建c 程序源代码 vim hello cpp include
  • Unity3D+EasyAR实现AR效果的案例

    1 下载EasyAR的压缩包以及下面我要用到的霸王龙模型 链接 https pan baidu com s 12q4Jp11BMxnIW1DB48yy0Q 密码 1y3y 2 新建一个Unity3D的项目 然后双击下载好的EasyAR 将其
  • 分支-07. 比较大小(10)

    本题要求将输入的任意3个整数从小到大输出 输入格式 输入在一行中给出3个整数 其间以空格分隔 输出格式 在一行中将3个整数从小到大输出 其间以 gt 相连 输入样例 4 2 8 输出样例 2 gt 4 gt 8 程序 include int
  • 吃透Chisel语言.15.Chisel模块详解(二)——Chisel模块嵌套和ALU实现

    Chisel模块详解 二 Chisel模块嵌套和ALU实现 稍微复杂点的硬件设计就需要用嵌套的模块层级来构建了 上一篇文章中实现的计数器其实就是个例子 计数器内部嵌套了一个寄存器 一个Mux和一个加法器 这一篇文章就仔细讲解模块之间是怎么连
  • 结构体注入VS setter 注入

    结构体注入 setter注入是比较常用的依赖注入方式 都有各自的优缺点 setter注入是Spring推荐的依赖注入方式 首先结构体注入有什么问题 1 不能重新配置和重新注入 在Spring参考文档 中基于结构体注入和setter注入有以下