海淀网站建设wzjs51爱你社区

bicheng/2026/1/20 19:43:43/文章来源:
海淀网站建设wzjs51,爱你社区,什么网站做贸易好,建湖专业做网站目录 前言 说明 依赖注入的类型 2.1 基于构造器的依赖注入 2.2 基于 Setter 的依赖注入 2.3 基于属性的依赖注入 基于字段的依赖注入缺陷 3.1 不允许声明不可变域 3.2 容易违反单一职责设计原则 3.3 与依赖注入容器紧密耦合 3.4 隐藏依赖关系 总结 参考文档 前言 … 目录 前言 说明 依赖注入的类型 2.1 基于构造器的依赖注入 2.2 基于 Setter 的依赖注入 2.3 基于属性的依赖注入 基于字段的依赖注入缺陷 3.1 不允许声明不可变域 3.2 容易违反单一职责设计原则 3.3 与依赖注入容器紧密耦合 3.4 隐藏依赖关系 总结 参考文档 前言 Spring 官方已不推荐使用 Autowired 字段/属性注入 bean一些大公司的新项目也明令禁止使用了。 说明 最近公司升级框架由原来的 spring framework 3.0 升级到 5.0然后写代码的时候突然发现 idea 在属性注入的 Autowired 注解上给出警告提示就像下面这样的也是挺懵逼的毕竟这么写也很多年了。 Field injection is not recommended 查阅了相关文档了解了一下原来这个提示是 spring framework 4.0 以后开始出现的spring 4.0 开始就不推荐使用属性注入改为推荐构造器注入和 setter 注入。 下面将展示了 spring 框架可以使用的不同类型的依赖注入以及每种依赖注入的适用情况。 依赖注入的类型 尽管针对 spring framework 5.1.3 的文档只定义了两种主要的依赖注入类型但实际上有三种 基于构造器的依赖注入基于 setter 的依赖注入基于字段的依赖注入 其中基于字段的依赖注入被广泛使用但是 idea 或者其他静态代码分析工具会给出提示信息不推荐使用。 甚至可以在一些 Spring 官方指南中看到这种注入方法 2.1 基于构造器的依赖注入 在基于构造函数的依赖注入中类构造函数被标注为 Autowired并包含了许多与要注入的对象相关的参数。 Component public class ConstructorBasedInjection {private final InjectedBean injectedBean;Autowired public ConstructorBasedInjection(InjectedBean injectedBean) { this.injectedBean injectedBean; } }然后在spring官方文档中Autowired 注解也是可以省去的。 public class SimpleMovieLister {// the SimpleMovieLister has a dependency on a MovieFinderprivate MovieFinder movieFinder;// a constructor so that the Spring container can inject a MovieFinderpublic SimpleMovieLister(MovieFinder movieFinder) {this.movieFinder movieFinder;}// business logic that actually uses the injected MovieFinder is omitted... }基于构造函数注入的主要优点是可以将需要注入的字段声明为 final 使得它们会在类实例化期间被初始化这对于所需的依赖项很方便。 2.2 基于 Setter 的依赖注入 在基于 setter 的依赖注入中setter 方法被标注为 Autowired。一旦使用无参数构造函数或无参数静态工厂方法实例化 Bean为了注入 Bean 的依赖项Spring 容器将调用这些 setter 方法。 Component public class SetterBasedInjection {private InjectedBean injectedBean;Autowiredpublic void setInjectedBean(InjectedBean injectedBean) {this.injectedBean injectedBean;} }和基于构造器的依赖注入一样在官方文档中基于 Setter 的依赖注入中的 Autowired 也可以省去。 public class SimpleMovieLister {// the SimpleMovieLister has a dependency on the MovieFinderprivate MovieFinder movieFinder;// a setter method so that the Spring container can inject a MovieFinderpublic void setMovieFinder(MovieFinder movieFinder) {this.movieFinder movieFinder;}// business logic that actually uses the injected MovieFinder is omitted... }2.3 基于属性的依赖注入 在基于属性的依赖注入中字段/属性被标注为 Autowired。一旦类被实例化Spring 容器将设置这些字段。 Component public class FieldBasedInjection {Autowiredprivate InjectedBean injectedBean; }正如所看到的这是依赖注入最干净的方法因为它避免了添加样板代码并且不需要声明类的构造函数。代码看起来很干净简洁但是正如代码检查器已经向我们暗示的那样这种方法有一些缺点。 基于字段的依赖注入缺陷 3.1 不允许声明不可变域 基于字段的依赖注入在声明为 final/immutable 的字段上不起作用因为这些字段必须在类实例化时实例化。声明不可变依赖项的唯一方法是使用基于构造器的依赖注入。 3.2 容易违反单一职责设计原则 在面向对象的编程中五大设计原则SOLID被广泛应用国内一般为六大设计原则用以提高代码的重用性可读性可靠性和可维护性。 S 在 SOLID 中代表单一职责原则即一个类应该只负责一项职责这个类提供的所有服务都应该只为它负责的职责服务。 使用基于字段的依赖注入高频使用的类随着时间的推移我们会在类中逐渐添加越来越多的依赖项我们用着很爽很容易忽略类中的依赖已经太多了。但是如果使用基于构造函数的依赖注入随着越来越多的依赖项被添加到类中构造函数会变得越来越大我们一眼就可以察觉到哪里不对劲。 有一个有超过10个参数的构造函数是一个明显的信号表明类已经转变一个大而全的功能合集需要将类分割成更小、更容易维护的块。 因此尽管属性注入并不是破坏单一责任原则的直接原因但它隐藏了信号使我们很容易忽略这些信号。spring系列技术文章Spring基础 - Spring 常用七大类注解 | 素文宅 (yoodb.com) 3.3 与依赖注入容器紧密耦合 使用基于字段的依赖注入的主要原因是为了避免 getter 和 setter 的样板代码或为类创建构造函数。最后这意味着设置这些字段的唯一方法是通过Spring容器实例化类并使用反射注入它们否则字段将保持 null。 依赖注入设计模式将类依赖项的创建与类本身分离开来并将此责任转移到类注入容器从而允许程序设计解耦并遵循单一职责和依赖项倒置原则(同样可靠)。因此通过自动装配autowiring字段来实现的类的解耦最终会因为再次与类注入容器(在本例中是 Spring)耦合而丢失从而使类在Spring容器之外变得无用。 这意味着如果您想在应用程序容器之外使用您的类例如用于单元测试您将被迫使用 Spring 容器来实例化您的类因为没有其他可能的方法(除了反射)来设置自动装配字段。 3.4 隐藏依赖关系 在使用依赖注入时受影响的类应该使用公共接口清楚地公开这些依赖项方法是在构造函数中公开所需的依赖项或者使用方法(setter)公开可选的依赖项。当使用基于字段的依赖注入时实质上是将这些依赖对外隐藏了。 总结 我们已经看到基于字段的注入应该尽可能地避免因为它有许多缺点无论它看起来多么优雅。推荐的方法是使用基于构造函数和基于setter的依赖注入。对于必需的依赖建议使用基于构造函数的注入设置它们为不可变的并防止它们为 null。对于可选的依赖项建议使用基于 setter 的注入。 参考文档 Field injection is not recommended – Spring IOC by Marc Nuri spring官方文档 1.4. Dependencies

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站手机版下悬浮条怎么做青岛微信网站制作

文章目录 IntroductionMethodControlNetControlNet for Text-to-Image DiffusionTrainingInference Experiments消融实验定量分析 在作者 github 上的一些讨论消融实验更进一步的探索Precomputed ControlNet 加快模型推理迁移控制能力到其他 SD1.X 模型上其他 Introduction 提…

怎么在华为防火墙做网站映射深圳住房建设部网站

查看帮助命令 kubectl --help 具体查看某个操作 kubectl get --help

常州建设工程交易网站wordpress新建文章模型

撰稿|行星 来源|贝多财经 9月5日,乐舱物流股份有限公司(下称“乐舱物流”)通过港交所上市聆讯,并披露了通过港交所聆讯后的资料集(即招股书),中信证券和农银国际为其联席保荐人。 成立于2004…

网站建设销售人才简历crm系统功能模块

背景 当flink消费kafka的消息时,我们经常会用到FlinkKafkaConsumer进行水位线的发送,本文就从源码看下FlinkKafkaConsumer.assignTimestampsAndWatermarks指定周期性水位线发送的流程 FlinkKafkaConsumer水位线发送 1.首先从Fetcher类开始&#xff0c…

河源做网站优化浙江省建设信息网官网

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…

展示型网站建设价格哪个网站有律师做的案件

IPv4 over IPv6隧道: 在IPv4 Internet向IPv6 Internet过渡后期,IPv6网络被大量部署后,而IPv4网络只是散布在世界各地的一些孤岛。利用隧道技术可以在IPv6网络上创建隧道,从而实现IPv4孤岛的互联,IPv4孤岛能通过IPv6公…

专注网站建设11年怎么做网站加盟

一、概述SRM订单管理的概念: SRM订单管理是指在供应商关系管理过程中,有效管理和控制订单的创建、处理和交付。它涉及与供应商之间的沟通、合作和协调,旨在实现订单的准确性、可靠性和及时性。 二、SRM订单管理的流程: 1. 订单创…

怎么样给自己做网站wordpress输出分类目录

一、多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时&#xff…

做产品目录的网站网站导航栏设计步骤

一个非常哇塞的在线短剧搜索页面,接口已经对接好了,上传源码到服务器解压就能直接用,有能力的可以自己改接口自己写自己的接口 接口文档地址:doc.djcat.sbs 源码下载地址:https://pan.xunlei.com/s/VNstN8C6N3VK1a1k…

六安网站怎么做seo马克杯在线设计网站

空燃比小于等于1使用下图:空燃比大于1,MAX变MIN,MIN变MAX,高低选互换即可。加负荷,先加空气,后加煤气,降负荷,先降煤气,后降空气。 交叉限幅和双交叉限幅的区别 交叉限幅…

官方网站怎么注册网站域名解绑

Docker Compose 是一种用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序所需的所有服务,然后使用单个命令创建并启动所有服务。Docker Compose 提供了一种高效、简洁的方式来管理Docker容器和服务,使得…

网站 使用的字体谷歌做公司网站需要多少钱

在过去的几个月中,我越来越多地涉足scala。 Scala与“ Play框架”一起为您提供了一个非常有效且快速的开发环境(即,您掌握了Scala语言的特质之后)。 Play框架背后的家伙一直在努力开发新版本的Play 2.0。 在Play 2.0中&#xff0c…

招聘网站有哪些vs2008 网站消息弹窗怎么做

最近在学tesseract,但遇到太多的问题是。 虽然网上有不少的方法,就算是按照tersseract,github上提供的方法也是编译不成功。 问题一大堆。不过我也想到了其它方法最张还是可以用了。 我有2个方法, 方法1, 1,先build t…

箱包东莞网站建设free wordpress template

jQuery介绍 官方网站: https://jquery.com jQuery 是一个 JavaScript 库 。极大地简化了 JavaScript 编程,例如 JS 原生代码几十行 实现的功 能, jQuery 可能一两行就可以实现,因此得到前端程序猿广泛应用。(现在处在比较边…

网站部分网页乱码seo按天计费系统

我只是把之前的学习笔记整理一下,贴到这里,可能会显得比较凌乱。。。1.1 啥是Docker?Docker 是一个开源项目,它被用来做构建、打包和运行程序。它是一个命令行程序,一个后台进程,也是一组使用逻辑方法来解决常见软件问…

6617网址导航彩票网站大全安全教育平台登录入口

需求:在小程序首页需要显示用户所在城市。 解决方案:使用wx.getLocation获取经纬度坐标,再使用微信小程序JavaScript SDK的地址逆解析方法reverseGeocoder,就可以完美搞定。 微信小程序JavaScript SDK官方地址 https://lbs.qq.c…

湖滨网站建设响应式网站概况

疫情期间,远程研发协作办公成为各企业的主要工作方式,本文将明源云以往的研发实践,结合本次远程办公的实际经验,分享一下面对跨地区多团队,如何高效在线协同,保证研发质量与效率的实践经验。面对当前严重的…

wordpress网站 添加微信支付做贸易网站

Kotlin 协程:深入理解 ‘lifecycleScope’ Kotlin 协程是一种强大的异步编程工具,它提供了一种简洁、易读的方式来处理并发和异步操作。在 Kotlin 协程库中,lifecycleScope 是一个关键的概念,它允许我们将协程的生命周期绑定到 An…

普陀区网站建设公司南通seo快速排名

本文介绍 Ubuntu 桌面系统升级的两种方式,通过 UI 或命令行的方式,演示为 20.04 升级为 22.04。并介绍了 windows 的 Linux 子系统 wsl 的升级注意事项。背景之前在学习 ROS2 时,安装 ros-humble-desktop 出现依赖错误:无法修正错…

山西建设公司网站小程序登录功能

1.概述 在13.0的系统产品rom定制化开发中,有些产品需要对Launcher3中桌面显示的app的icon做替换,如果没有源码的话更换会麻烦点,需要从pms解析app的时候, 可以替换掉app的icon图标就可以了,接下来就来实现相关的功能 2.无源码app修改它的icon图标的相关核心类 framework…