最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring IOC 能降低耦合的問題分析及解決方法

 更新時間:2022年06月27日 11:47:46   作者:說故事的五公子  
這篇文章主要介紹了Spring IOC 為什么能降低耦合,依賴注入是調(diào)用者僅通過聲明某個組件就可以獲得組件的控制權(quán),而對該組件的依賴關(guān)系管理、查找、加載由外部完成,需要的朋友可以參考下

有同學在學習 Spring 框架中可能會問這樣的問題,為什么通過依賴注入就可以降低代碼間的耦合呢?我通過 new 生產(chǎn)對象不也可以嗎,不就是一行代碼的不同,一個是 @Resource 注入,一個是 new 創(chuàng)建,怎么就降低耦合了?

今天博主就帶大家來一步步剖析這個問題

一、傳統(tǒng)方式創(chuàng)建對象

通常我們是這樣創(chuàng)建對象的

WuliCar wuli = new WuliCar();
wuli.run();

第一天:二明想用一輛車,然后通過 new 搞了一輛五菱榮光,調(diào)用 run 方法開始使用,車子跑起來了,很高興。

一個月后:二明公司賺錢了,不想開五菱了,想換輛寶馬,接下來二明一頓操作:

BaomaCar baoma = new BaomaCar();
baoma.run();

很好,車子從五菱換成了寶馬,跑起來了,很高興。

半年后:二明公司賺大錢了,二明想搞輛直升機,接下來又一頓操作

ZhiShenJi zhi = new ZhiShenJi();
zhi.fly();

這次改動比較大,寶馬換成直升機,run 換成了 fly。

看到這里先思考一下,不想往下看,這樣做有什么問題嗎?

思考時間到,我們接著往下看。

從代碼看好像沒多大問題,不就改了兩行代碼嘛,這有啥。你想想,如果你的代碼中有 1000 個地方都是這么寫的,你想把寶馬換成直升機豈不是要改 1000 次,run 改成 fly 又要改 1000 次,晚上別想下班了。

二、接口編程

經(jīng)過上次一頓操作,二明加了好幾天班才弄完,二明想想每天這么搞不得累死,不行,得想想辦法。于是二明腦子一轉(zhuǎn)了,一想就想到了。我定義好一些方法,大家都按照這個規(guī)則來,不就好了。

public interface vehicle {
    // 定義一個交通工具接口,有一個 work 方法
	void work();
}

寶馬實現(xiàn)這個接口:

public class Baoma implements vehicle {
    @Override
    public void work() {
		System.out.println("寶馬跑起來");        
    }
}

飛機實現(xiàn)這個接口:

public class ZhiShenJi implements vehicle {
    @Override
    public void work() {
		System.out.println("直升機飛起來");        
    }
}

經(jīng)過上面改造后,后面二明想把寶馬換成直升機的時候只需要修改 new 那塊就可以了,省了很多時間

三、工廠方法

利用接口確實好一些了,但是問題還是沒有解決。為了提高內(nèi)聚性,專職類負責特定的事情,所以我們使用一個類作為工廠類,既能生產(chǎn) Car 又能生產(chǎn) ZhiShenJi

class VehicleFactory{
	VehicleFactory(){}
	public static Vehicle getInstance(String type){
		Animal result = null;
		if("car".equals(type)){
			result = new Car();
		}
		if("zhishenji".equals(type)){
			result = new ZhiShenJi();
		}
		return result;
	}
}

如果有一次我想鍛煉身體,想騎自行車了,那么很簡單

class VehicleFactory{
	VehicleFactory(){}
	public static Vehicle getInstance(String type){
		Animal result = null;
		if("car".equals(type)){
			result = new Car();
		}
		if("zhishenji".equals(type)){
			result = new ZhiShenJi();
		}
        if("zixingche".equals(type)){
			result = new ZiXingChe();
		}
		return result;
	}
}
Vehicle vehicle = VehicleFactory.getInstance("zixingche");
vehicle.work();

這種方法把創(chuàng)建對象的過程交給了一個專業(yè)的類(Factory),我只需要告訴他我需要什么(參數(shù)),他就會返回給我正確的對象,只是解決了內(nèi)聚性的問題,但是他并沒有解決我的聲明語句七零八落的散落在程序中,我還是需要去將參數(shù)從car替換為zixingche

四、反射

后來二明想到一個更絕妙的主意.我在寫程序的時候不告訴工廠我需要什么,等到運行的時候我再告訴工廠我需要什么,再利用反射技術(shù)給我生產(chǎn)出來不就可以了嗎?二明說干就干

Vehicle vehicle = VehicleFactory.getInstance(讀取配置文件);
vehicle.work();
我想要的:zixingche
zixingche.work();

大功告成,這樣我要什么,都寫在一個配置文件中,利用反射技術(shù)就可以創(chuàng)建好,這樣我就不用在生產(chǎn)了,下次換車的時候直接去配置文件中修改就好了,代碼中不用修改。

對于生產(chǎn)對象這件和業(yè)務(wù)沒有直接關(guān)系的事情,我們已經(jīng)提取給了專業(yè)的工廠,專業(yè)的工廠還是根據(jù)配置文件進行的生產(chǎn),想生產(chǎn)什么我只需要改一處即可,這就是降低了耦合性(生產(chǎn)對象和業(yè)務(wù)之間的耦合,讓生產(chǎn)對象對業(yè)務(wù)的影響降到了最低)。

五、Spring IOC

上面第四點說的那些功能,Spring IOC 已經(jīng)幫助我們實現(xiàn)了,Spring IOC 就是利用工廠模式+反射實現(xiàn)自動生產(chǎn)對象,管理對象生命周期的功能。降低了代碼的耦合

總結(jié)

  • 依賴注入的意思是你需要的東西不是由你創(chuàng)建的,而是第三方,或者說容器提供給你的。這樣的設(shè)計符合正交性,即所謂的松耦合。
  • 依賴注入是調(diào)用者僅通過聲明某個組件就可以獲得組件的控制權(quán),而對該組件的依賴關(guān)系管理、查找、加載由外部完成。
  • 依賴注入就是你不用關(guān)心對象的生命周期,什么時候被創(chuàng)建,什么時候銷毀,只需直接使用即可,對象的生命周期由提供依賴注入的框架來管理。

到此這篇關(guān)于Spring IOC 為什么能降低耦合的文章就介紹到這了,更多相關(guān)Spring IOC 降低耦合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java String中intern方法的原理與使用

    詳解Java String中intern方法的原理與使用

    這篇文章主要為大家介紹了Java String中intern方法的原理以及使用。文中通過圖片和示例代碼進行了詳細展示,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-05-05
  • 使用spring boot 整合kafka,延遲啟動消費者

    使用spring boot 整合kafka,延遲啟動消費者

    這篇文章主要介紹了使用spring boot 整合kafka,延遲啟動消費者的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Netty如何設(shè)置為Https訪問

    Netty如何設(shè)置為Https訪問

    這篇文章主要介紹了Netty如何設(shè)置為Https訪問,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java詳解AVL樹的應用

    Java詳解AVL樹的應用

    AVL樹是高度平衡的二叉樹,它的特點是AVL樹中任何節(jié)點的兩個子樹的高度最大差別為1,本文主要給大家介紹了Java如何實現(xiàn)AVL樹,需要的朋友可以參考下
    2022-07-07
  • Java通過cellstyle屬性設(shè)置Excel單元格常用樣式的全面總結(jié)講解

    Java通過cellstyle屬性設(shè)置Excel單元格常用樣式的全面總結(jié)講解

    在處理Excel文件時,經(jīng)常需要對單元格進行樣式設(shè)置,以滿足特定的需求和美化要求,這篇文章主要給大家介紹了關(guān)于Java通過cellstyle屬性設(shè)置Excel單元格常用樣式的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring Cloud Gateway入門解讀

    Spring Cloud Gateway入門解讀

    本篇文章主要介紹了Spring Cloud Gateway入門解讀,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http.HttpServletRequest not present解決辦法

    SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http

    這篇文章主要介紹了SpringBoot3.1.2 引入Swagger報錯Type javax.servlet.http.HttpServletRequest not present解決辦法,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • SpringCloud Ribbon 負載均衡的實現(xiàn)

    SpringCloud Ribbon 負載均衡的實現(xiàn)

    Ribbon是一個客戶端負載均衡器,它提供了對HTTP和TCP客戶端的行為的大量控制。這篇文章主要介紹了SpringCloud Ribbon 負載均衡的實現(xiàn),感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java設(shè)計模式之命令模式_動力節(jié)點Java學院整理

    Java設(shè)計模式之命令模式_動力節(jié)點Java學院整理

    命令模式就是對命令的封裝,下文中給大家介紹了命令模式類圖中的基本結(jié)構(gòu),對java設(shè)計模式之命令模式相關(guān)知識感興趣的朋友一起看看吧
    2017-08-08
  • 在JAVA?Web項目中動態(tài)加載DLL/SO文件的方法

    在JAVA?Web項目中動態(tài)加載DLL/SO文件的方法

    在JAVA?Web項目中,我們經(jīng)常需要調(diào)用一些第三方庫或者實現(xiàn)一些JAVA本身不支持的功能,這時,我們可能會考慮使用JNI來調(diào)用DLL或SO文件,然而,因此,本文將介紹如何在JAVA?Web項目中動態(tài)加載DLL/SO文件,需要的朋友可以參考下
    2024-12-12

最新評論

三河市| 扶沟县| 江源县| 常德市| 留坝县| 宿松县| 民县| 武冈市| 筠连县| 蒙山县| 吴江市| 涟水县| 临沧市| 荆州市| 栖霞市| 苍南县| 留坝县| 盐城市| 高邑县| 鲁山县| 苗栗县| 旌德县| 延长县| 社会| 南昌县| 甘孜| 宜阳县| 昭苏县| 运城市| 吉安市| 和平县| 武定县| 孟村| 灌南县| 南京市| 汽车| 玉田县| 博客| 巴彦淖尔市| 寿阳县| 侯马市|