欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于spring依賴(lài)注入的方式以及優(yōu)缺點(diǎn)

 更新時(shí)間:2023年07月18日 08:45:43   作者:xiegongmiao  
這篇文章主要介紹了關(guān)于spring依賴(lài)注入的方式以及優(yōu)缺點(diǎn),依賴(lài)注入,是IOC的一個(gè)方面,是個(gè)通常的概念,它有多種解釋,這概念是說(shuō)你不用創(chuàng)建對(duì)象,而只需要描述它如何被創(chuàng)建,需要的朋友可以參考下

一.依賴(lài)注入的三種方式

1.通過(guò)構(gòu)造器注入。(spring4.3之后,推薦使用)

2.通過(guò)setter注入。(spring4.3之前,推薦使用)

3通過(guò)filed注入。

二.三種方式的代碼示例:

Constructor注入

    private AlarmContactService alarmContactService;
	private final AlarmService alarmService;
	private final SysUserService sysUserService;
    @Autowired
	public 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;
	@Autowired
	public void setAlarmContactService(AlarmContactService alarmContactService) {
		this.alarmContactService = alarmContactService;
	}
	@Autowired
	public void setAlarmService(AlarmService alarmService) {
		this.alarmService = alarmService;
	}
	@Autowired
	public void setSysUserService(SysUserService sysUserService) {
		this.sysUserService = sysUserService;
	}

Field注入

    @Autowired
	private AlarmContactService alarmContactService;
	@Autowired
	private AlarmService alarmService;
	@Autowired
	private SysUserService sysUserService;

三.3種方式的各優(yōu)點(diǎn)和缺點(diǎn)

三種方式的優(yōu)點(diǎn)分析

1.基于構(gòu)造器注入,會(huì)固定依賴(lài)注入的順序,不允許我們創(chuàng)建的bean對(duì)象之間存在循環(huán)依賴(lài)關(guān)系,這樣Spring能解決循環(huán)依賴(lài)的問(wèn)題。

2.基于setter注入,只有對(duì)象是需要被注入的時(shí)候,才會(huì)注入依賴(lài),而不是在初始化的時(shí)候就注入。

3.在成員變量上寫(xiě)上注解來(lái)注入,這種方式,精短,可讀性高,不需要多余的代碼,也方便維護(hù)。

三種方式的缺點(diǎn)分析

1.使用構(gòu)造器注入的缺點(diǎn)是,當(dāng)我們構(gòu)造器需要注入的對(duì)象比較多時(shí),會(huì)顯得我們的構(gòu)造器,冗余,不美觀(guān),可讀性差,也不易維護(hù)。

2.當(dāng)我們選擇setter方法來(lái)注入的時(shí)候,我們不能將對(duì)象設(shè)為final的;

3.當(dāng)我們?cè)趂ield變量上來(lái)實(shí)現(xiàn)注入的時(shí)候

    a.這樣不符合JavaBean的規(guī)范,而且很有可能引起空指針;

    b.同時(shí)也不能將對(duì)象標(biāo)為final的;

  c.類(lèi)與DI容器高度耦合,我們不能在外部使用它;

    d.類(lèi)不通過(guò)反射不能被實(shí)例化(例如單元測(cè)試中),你需要用DI容器去實(shí)例化它,這更像集成測(cè)試;

來(lái)自Spring官方文檔的建議

在Spring 3.x 中,Spring團(tuán)隊(duì)建議我們使用setter來(lái)注入:

而在Spring 4.x 中,Spring團(tuán)隊(duì)不再建議我們使用setter來(lái)注入,改為了constructor:

Spring團(tuán)隊(duì)通常建議使用構(gòu)造器來(lái)注入,因?yàn)樗试S一個(gè)應(yīng)用程序組件實(shí)現(xiàn)為不可變對(duì)象,并確保所需的依賴(lài)項(xiàng)不是空。此外構(gòu)造器注入組件總是返回一個(gè)完全初始化狀態(tài)的client客戶(hù)端(調(diào)用)。附注,大量的構(gòu)造函數(shù)參數(shù)是一個(gè)糟糕的代碼習(xí)慣,看起來(lái)也很壞,這意味著類(lèi)可能有太多的責(zé)任,應(yīng)該被重構(gòu),以更好地解決適當(dāng)?shù)年P(guān)注點(diǎn)分離。

三.解釋下什么是循環(huán)依賴(lài)

1. 循環(huán)依賴(lài)是什么?

Bean A 依賴(lài) B,Bean B 依賴(lài) A這種情況下出現(xiàn)循環(huán)依賴(lài)。

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

2. 循環(huán)依賴(lài)會(huì)產(chǎn)生什么結(jié)果?

當(dāng)Spring正在加載所有Bean時(shí),Spring嘗試以能正常創(chuàng)建Bean的順序去創(chuàng)建Bean。

例如,有如下依賴(lài):

Bean A → Bean B → Bean C

Spring先創(chuàng)建beanC,接著創(chuàng)建bean B(將C注入B中),最后創(chuàng)建bean A(將B注入A中)。

假如,有如下循環(huán)依賴(lài):

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

但當(dāng)存在循環(huán)依賴(lài)時(shí),Spring將無(wú)法決定先創(chuàng)建哪個(gè)bean。這種情況下,Spring將產(chǎn)生異常BeanCurrentlyInCreationException。

Spring 4.3 的新特征:

在Spring 4.3 以后,如果我們的類(lèi)中只有單個(gè)構(gòu)造函數(shù),那么Spring就會(huì)實(shí)現(xiàn)一個(gè)隱式的自動(dòng)注入:

就是我去掉了構(gòu)造器上的@Autowired注解,經(jīng)測(cè)試后發(fā)現(xiàn),程序能正常運(yùn)行。alarmContactService,alarmService,sysUserService的依賴(lài)也被成功注入了。

    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;
	}

使用構(gòu)造注入允許加入final,這也表示以后不能再被更改了。 

到此這篇關(guān)于關(guān)于spring依賴(lài)注入的方式以及優(yōu)缺點(diǎn)的文章就介紹到這了,更多相關(guān)spring依賴(lài)注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java Swing組件setBounds()簡(jiǎn)單用法實(shí)例分析

    java Swing組件setBounds()簡(jiǎn)單用法實(shí)例分析

    這篇文章主要介紹了java Swing組件setBounds()簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Swing組件setBounds()方法的功能與簡(jiǎn)單使用方法,需要的朋友可以參考下
    2017-11-11
  • SpringBoot整合RabbitMQ實(shí)現(xiàn)流量消峰

    SpringBoot整合RabbitMQ實(shí)現(xiàn)流量消峰

    RabbitMQ 即一個(gè)消息隊(duì)列,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用,消息中間件在互聯(lián)網(wǎng)公司的使用中越來(lái)越多,本文給大家介紹了SpringBoot整合RabbitMQ實(shí)現(xiàn)流量消峰,需要的朋友可以參考下
    2024-12-12
  • Java設(shè)計(jì)模式單例模式(Singleton)用法解析

    Java設(shè)計(jì)模式單例模式(Singleton)用法解析

    這篇文章主要介紹了Java設(shè)計(jì)模式單例模式(Singleton)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringSecurity數(shù)據(jù)庫(kù)進(jìn)行認(rèn)證和授權(quán)的使用

    SpringSecurity數(shù)據(jù)庫(kù)進(jìn)行認(rèn)證和授權(quán)的使用

    本文主要介紹了用戶(hù)的賬號(hào)、密碼以及角色信息在數(shù)據(jù)庫(kù)中的認(rèn)證和授權(quán),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • ElasticSearch的完整安裝教程

    ElasticSearch的完整安裝教程

    這篇文章主要給大家分享介紹了ElasticSearch的完整安裝教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ElasticSearch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別

    MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別

    本文主要介紹了MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別,深入探討UNION和UNION ALL的定義、用法、主要區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • Java 如何使用正則表達(dá)式去除前導(dǎo)0

    Java 如何使用正則表達(dá)式去除前導(dǎo)0

    這篇文章主要介紹了Java 使用正則表達(dá)式去除前導(dǎo)0的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • spring boot實(shí)戰(zhàn)之本地jar包引用示例

    spring boot實(shí)戰(zhàn)之本地jar包引用示例

    本篇文章主要介紹了spring boot實(shí)戰(zhàn)之本地jar包引用示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java猴子吃桃問(wèn)題

    Java猴子吃桃問(wèn)題

    這篇文章主要介紹了Java猴子吃桃問(wèn)題,采取逆向思維的方法,從后往前推斷,需要的朋友可以參考下
    2017-02-02
  • mybatis項(xiàng)目CRUD步驟實(shí)例詳解

    mybatis項(xiàng)目CRUD步驟實(shí)例詳解

    這篇文章主要介紹了mybatis項(xiàng)目CRUD步驟,包括pom.xml引入相應(yīng)的依賴(lài),在resources目錄下寫(xiě)配置文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論