spring依赖注入的三种方式以及优缺点

article/2025/9/14 21:09:39

spring依赖注入的三种方式以及优缺点

一.依赖注入的三种方式

1.通过构造器注入。(spring4.3之后,推荐使用)

2.通过setter注入。(spring4.3之前,推荐使用)

3通过filed注入。

二.三种方式的代码示例:

Constructor注入

    private AlarmContactService alarmContactService;private final AlarmService alarmService;private final SysUserService sysUserService;@Autowiredpublic AlarmContactController(AlarmContactService alarmContactService, AlarmService alarmService,SysUserService sysUserService) {this.alarmContactService = alarmContactService;this.alarmService = alarmService;this.sysUserService = sysUserService;}

Setter注入

private AlarmContactService alarmContactService;private AlarmService alarmService;private SysUserService sysUserService;@Autowiredpublic void setAlarmContactService(AlarmContactService alarmContactService) {this.alarmContactService = alarmContactService;}@Autowiredpublic void setAlarmService(AlarmService alarmService) {this.alarmService = alarmService;}@Autowiredpublic void setSysUserService(SysUserService sysUserService) {this.sysUserService = sysUserService;}

Field注入

    @Autowiredprivate AlarmContactService alarmContactService;@Autowiredprivate AlarmService alarmService;@Autowiredprivate SysUserService sysUserService;

三.3种方式的各优点和缺点

三种方式的优点分析

1.基于构造器注入,会固定依赖注入的顺序,不允许我们创建的bean对象之间存在循环依赖关系,这样Spring能解决循环依赖的问题。

2.基于setter注入,只有对象是需要被注入的时候,才会注入依赖,而不是在初始化的时候就注入。

3.在成员变量上写上注解来注入,这种方式,精短,可读性高,不需要多余的代码,也方便维护。

三种方式的缺点分析

1.使用构造器注入的缺点是,当我们构造器需要注入的对象比较多时,会显得我们的构造器,冗余,不美观,可读性差,也不易维护。

2.当我们选择setter方法来注入的时候,我们不能将对象设为final的;

3.当我们在field变量上来实现注入的时候

    a.这样不符合JavaBean的规范,而且很有可能引起空指针;

    b.同时也不能将对象标为final的;

  c.类与DI容器高度耦合,我们不能在外部使用它;

    d.类不通过反射不能被实例化(例如单元测试中),你需要用DI容器去实例化它,这更像集成测试;

 

来自Spring官方文档的建议:  
在Spring 3.x 中,Spring团队建议我们使用setter来注入:

而在Spring 4.x 中,Spring团队不再建议我们使用setter来注入,改为了constructor:

Spring团队通常建议使用构造器来注入,因为它允许一个应用程序组件实现为不可变对象,并确保所需的依赖项不是空。此外构造器注入组件总是返回一个完全初始化状态的client客户端(调用)。附注,大量的构造函数参数是一个糟糕的代码习惯,看起来也很坏,这意味着类可能有太多的责任,应该被重构,以更好地解决适当的关注点分离。

 

三.解释下什么是循环依赖:

1. 循环依赖是什么?

Bean A 依赖 B,Bean B 依赖 A这种情况下出现循环依赖。

Bean A → Bean B → Bean A     或者 Bean A → Bean B → BeanC → Bean A

2. 循环依赖会产生什么结果?

当Spring正在加载所有Bean时,Spring尝试以能正常创建Bean的顺序去创建Bean。

例如,有如下依赖:

Bean A → Bean B → Bean C

Spring先创建beanC,接着创建bean B(将C注入B中),最后创建bean A(将B注入A中)。

假如,有如下循环依赖:

Bean A → Bean B → Bean C → BeanD → Bean A  

 

但当存在循环依赖时,Spring将无法决定先创建哪个bean。这种情况下,Spring将产生异常BeanCurrentlyInCreationException。

 

一条Spring 4.3 的新特征:

在Spring 4.3 以后,如果我们的类中只有单个构造函数,那么Spring就会实现一个隐式的自动注入:

就是我去掉了构造器上的@Autowired注解,经测试后发现,程序能正常运行。alarmContactService,alarmService,sysUserService的依赖也被成功注入了。

    private AlarmContactService alarmContactService;private final AlarmService alarmService;private final SysUserService sysUserService;public AlarmContactController(AlarmContactService alarmContactService, AlarmService alarmService,SysUserService sysUserService) {this.alarmContactService = alarmContactService;this.alarmService = alarmService;this.sysUserService = sysUserService;}

使用构造注入允许加入final,这也表示以后不能再被更改了。

 

 


http://chatgpt.dhexx.cn/article/rZv917ba.shtml

相关文章

依赖注入的三种方式和循环依赖的产生

什么是循环依赖 说白了就是对象之间的依赖关系成环 例如A->B,B->C,C->A,并不限于对象的多少,最终成环就是循环依赖,也因此循环依赖的发生可能是十分复杂的。,如果使用属性注入的话,开发过程中甚至很难察觉。…

[Spring] IoC的理解及三种依赖注入方式

[Spring] IoC的理解及三种依赖注入方式 Spring---IoC的理解及三种依赖注入方式IoC是什么意思依赖控制反转 Spring提供的依赖注入的三种方式setter注入(属性注入)构造器注入p命名空间注入(工厂方法注入) Autowired Spring—IoC的理…

Spring依赖注入的三种方式

目录 一、变量注入(Field Injection) 二、构造器注入(Constructor Injection) 三、setter方法注入 (Setter Injection) 四、使用场景 Spring的依赖注入,我们一般使用Autowired注解来完成&am…

依赖注入的三种方式

DI(依赖注入) 注入的三种方法:构造器方法注入,set注入,基于注解的注入(接口注入) 1:构造器方法注入 创建一个Address类; public class Address {private String address;public Address() {}pu…

Pubmedy的使用教程

使用方法如下: 使用前先配置Sci-Hub的地址,如果网址不失效,配置一次即可 选中文章的DOI,右击选择Sci-Hub Search即可自动跳转到文章对应的Sci-Hub界面

Pubmedy加载时显示程序包无效的解决方案

目前谷歌应用商城已经下架Pubmedy,本地安装又遇到程序包无效:“CRX_HEADER_INVALID”。 解决方案: 将PubMedy.crx重命名为PubMedy.rar或者PubMedy.zip解压到要安装的位置找到扩展程序选项,并启用开发者选项选择加载已解压的扩展程…

细胞实验文献检索——PubMed | MedChemExpress

今天我们就以小白的课题——自噬 (Autophagy) 为例,给大家展示一波。这个时候给大家隆重介绍我们的——PubMed。 PubMed 提到 PubMed,相信大家应该都不陌生,它是常用的国外数据库之一,也是小编查找文献最喜欢的工具。自成立以来…

免费获取论文全文的方法,SCI-HUB的使用教程

很多人不在学校期间需要看文献全文,很多人获取文章的方式或是在网上求助或是给原作者索要。在SCI—HUB出现后,这些麻烦都不需要。SCI—PUB上保存了超过了4700万篇科研文献。SCI—PUB的网址 使用方法: 方法一、打开网页将想要论文的URL地址&…

SCI-HUB丨最新文献网址

sci-hub:在我们获取文献与学术论文的道路上提供了极好的便利,可以从中得到免费的文献下载,但也因为这样遭到各大出版社:ai思为尔,施普林格,wiley等出版社的打击与封杀,使得Sci-Hub在域名上不得不…

pubmed显示服务器不稳定,PubMed天天用,可是你真的用对了吗?

你是用关键词在PubMed上找论文的吗?如果关键词好几个,由于单词间的空格键存在AND命令,导致明明要搜的是词组,搜索不是被放大就是缩小,很难检索到合适量且关联度高的文。例如,你想找和肠炎与肿瘤坏死因子相关…

pubmed文献批量化下载器

1.代码如下 import time import requests import pandas as pd import osdef getArticle(PMCID,NIHMSID,DOI,title,path):print(PMCID,NIHMSID,DOI,title,path)os.chdir(path)headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

PubMed插件:分区、影响因子和即时IF一目了然,还能秒下文献(亲测有效)

Pubmed作为生物医药研究者最常用的免费文摘数据库,素有检索江湖上的泰山北斗之称,用好Pubmed,其他一切pubmed镜像网站都是浮云。今天小编给大家介绍一款完全免费的无需登录的pubmed插件,他可以解决pubmed本身不显示杂志影响因子的…

干货分享|被PubMed收录的论文,在MEDLINE和SCIE能检索到吗?

PubMed PubMed是由美国国家医学图书馆(National Library of Medicine,NLM)的国家生物技术信息中心(National Center for Biotechnology Information,NCBI)开发研制的一个医学文献网络数据库。PubMed是当今…

MEDLINE与PubMed有什么区别?检索范围包含哪些?

PubMed PubMed是由美国国家医学图书馆(National Library of Medicine,NLM)的国家生物技术信息中心(National Center for Biotechnology Information,NCBI)开发研制的一个医学文献网络数据库。 PubMed是当今…

怎么找生物信息论文的数据,PubMed太有用了!

小白的创作灵感日志: 由于要跑通一篇Paper A的代码,我需要找到它用到的所有数据集,今天我要找的是 Nagano 细胞周期数据集,刚开始脑子一团浆糊,直接在谷歌上搜“Nagano”,出来的全都是日本的一个名叫Nagano…

PubMed文献影响因子怎么显示保姆教程

NCBI文献影响因子显示: 安装的第一个插件:Tampermonkey插件网址:Greasy Fork - 安全、实用的用户脚本大全 1.选择合适的浏览器进行安装 2.点击安装 安装的第二个插件:scholarscope 1.网址:Scholarscope | 更好的科研…

文献管理器PubMedPro使用

PubMedPro介绍 Pubmed.pro文献检索文献管理网站: 您可以将自己电脑中的文献PDF批量上传至本网站,所有文件会自动同步至云端,您可以子啊任意一台电脑、平板、手机,通过自己的账号在线访问文献PDF。也可以分享自己的文献给身边的同…

科研小助手PubMed的插件PubMedy

Scholarscope首页地址: https://www.scholarscope.cn/(此链接就可以帮你安装,里面“查看安装教程”下面有个“立即前往安装教程页面”按钮,点击即可。) 此插件的安装也很简单,在Chrome浏览器的安装跟其他插件的安装没有区别。 而…

PubMed插件神器之PubMedy和Scholarscope(末尾附赠Google截屏神器)

生信读研第一件事绝对是读大量文献,那么如何在PubMed大量的文献中筛选出自己想要并且高质量的呢?当然第一反应肯定是检索式,但这得自己清楚的知道课题的关键词才能准确筛选。 刚进实验室,大师兄就扔给我两篇文献让我去了解。但是!…

jdk完全卸载方法

Win7系统下安装jdk报错;错误信息:“ Windows Installer 程序包有问题。此安装需要的DLL不能运行。请与您的支持人员或程序包开发商联系”。 造成该问题的原因是系统以前安装过jdk,重新安装需要彻底卸载旧的jdk,这样重新安装才能成…