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

Spring IoC和DI深度解析

 更新時(shí)間:2026年02月13日 11:22:17   作者:新綠MEHO  
Spring是包含了眾多工具方法的IoC容器,本文給大家介紹Spring IoC和DI深度解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨小編一起看看吧

Spring 是包含了眾多?具?法的 IoC 容器.

IoC

什么是IoC?

像在類上?添加 @RestController 和@Controller 注解, 就是把這個(gè)對(duì)象交給Spring管理, Spring 框架啟動(dòng)時(shí)就會(huì)加載該類. 把對(duì)象交給Spring管理, 就是IoC思想.

IoC:Inversion of Control (控制反轉(zhuǎn)), 也就是說(shuō) Spring 是?個(gè)"控制反轉(zhuǎn)"的容器.

什么是控制反轉(zhuǎn)呢? 也就是控制權(quán)反轉(zhuǎn). 什么的控制權(quán)發(fā)?了反轉(zhuǎn)? 獲得依賴對(duì)象的過(guò)程被反轉(zhuǎn)了也就是說(shuō), 當(dāng)需要某個(gè)對(duì)象時(shí), 傳統(tǒng)開(kāi)發(fā)模式中需要??通過(guò) new 創(chuàng)建對(duì)象, 現(xiàn)在不需要再進(jìn)?創(chuàng)建, 把創(chuàng)建對(duì)象的任務(wù)交給容器, 程序中只需要依賴注? (Dependency Injection,DI)就可以了.
這個(gè)容器稱為:IoC容器. Spring是?個(gè)IoC容器, 所以有時(shí)Spring 也稱為Spring 容器.

引入

傳統(tǒng)實(shí)現(xiàn)思路

我們的實(shí)現(xiàn)思路是這樣的:
先設(shè)計(jì)輪?(Tire),然后根據(jù)輪?的??設(shè)計(jì)底盤(Bottom),接著根據(jù)底盤設(shè)計(jì)??(Framework),最后根據(jù)??設(shè)計(jì)好整個(gè)汽?(Car)。這?就出現(xiàn)了?個(gè)"依賴"關(guān)系:汽?依賴??,??依賴底盤,底盤依賴輪?. 

代碼實(shí)現(xiàn)

public class Main {
    public static void main(String[] args) {
        Car car = new Car(21);
        car.run();
        Car car2 = new Car(17);
        car2.run();
    }
}
//汽車
class Car {
    private Framework framework;
    public Car(int size) {
        framework = new Framework(size);
        System.out.println("framework init...");
    }
    public void run() {
        System.out.println("car run...");
    }
}
//車身
class Framework {
    private Bottom bottom;
    public Framework(int size) {
        bottom =  new Bottom(size);
        System.out.println("bottom init....");
    }
}
//底盤
class Bottom {
    private Tire tire;
    public Bottom(int size) {
        tire = new Tire(size);
        System.out.println("tire init...");
    }
}
//輪胎
class Tire {
    private int size;
    public Tire(int size) {
        System.out.println("tire size:"+size);
    }
}

上面這樣的設(shè)計(jì)看起來(lái)沒(méi)問(wèn)題,但是可維護(hù)性卻很低,因?yàn)樾枨罂赡軙?huì)越來(lái)越多,比如增加輪胎顏色,修改后的代碼如下:

我們可以看到,修改后的代碼會(huì)報(bào)錯(cuò),并且需要我們繼續(xù)修改

完整代碼如下:

public class Main {
    public static void main(String[] args) {
        Car car = new Car(21,"aaa");
        car.run();
        Car car2 = new Car(17,"bbb");
        car2.run();
    }
}
//汽車
class Car {
    private Framework framework;
    public Car(int size,String color) {
        framework = new Framework(size,color);
        System.out.println("framework init...");
    }
    public void run() {
        System.out.println("car run...");
    }
}
//車身
class Framework {
    private Bottom bottom;
    public Framework(int size,String color) {
        bottom =  new Bottom(size,color);
        System.out.println("bottom init....");
    }
}
//底盤
class Bottom {
    private Tire tire;
    public Bottom(int size,String color) {
        tire = new Tire(size,color);
        System.out.println("tire init...");
    }
}
//輪胎
class Tire {
    private int size;
    private String color;
    public Tire(int size,String color) {
        System.out.println("tire size:"+size);
    }
}

從以上代碼可以看出,以上程序的問(wèn)題是:當(dāng)最底層代碼改動(dòng)之后,整個(gè)調(diào)?鏈上的所有代碼都需要修改.
程序的耦合度?常?(修改?處代碼, 影響其他處的代碼修改)。

解決方案

我們嘗試改變實(shí)現(xiàn)方式:輪?依賴底盤, 底盤依賴??,??依賴汽?。

基于以上思路,我們把調(diào)?汽?的程序?例改造?下,把創(chuàng)建?類的?式,改為注?傳遞的?式。

完整代碼如下:

class Main {
    public static void main(String[] args) {
        Tire tire = new Tire(17, "red");
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }
}
//汽車
class Car {
    private Framework framework;
    public Car(Framework framework) {
        this.framework = framework;
        System.out.println("framework init...");
    }
    public void run() {
        System.out.println("car run...");
    }
}
//車身
class Framework {
    private Bottom bottom;
    public Framework(Bottom bottom) {
        this.bottom = bottom;
        System.out.println("bottom init....");
    }
}
//底盤
class Bottom {
    private Tire tire;
    public Bottom(Tire tire) {
        this.tire=tire;
        System.out.println("tire init...");
    }
}
//輪胎
class Tire {
    private int size;
    private String color;
    public Tire(int size, String color) {
        System.out.println("tire size:"+size+",color:"+color);
    }
}

代碼經(jīng)過(guò)以上調(diào)整,?論底層類如何變化,整個(gè)調(diào)?鏈?zhǔn)遣?做任何改變的,這樣就完成了代碼之間的解耦,從?實(shí)現(xiàn)了更加靈活、通?的程序設(shè)計(jì)了。

IoC的優(yōu)勢(shì)

在傳統(tǒng)的代碼中對(duì)象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire
改進(jìn)之后解耦的代碼的對(duì)象創(chuàng)建順序是:Tire -> Bottom -> Framework -> Car

我們發(fā)現(xiàn)了?個(gè)規(guī)律,通?程序的實(shí)現(xiàn)代碼,類的創(chuàng)建順序是反的,傳統(tǒng)代碼是 Car 控制并創(chuàng)建了Framework,F(xiàn)ramework 創(chuàng)建并創(chuàng)建了 Bottom,依次往下,?改進(jìn)之后的控制權(quán)發(fā)?的反轉(zhuǎn),不再是使??對(duì)象創(chuàng)建并控制依賴對(duì)象了,?是把依賴對(duì)象注?將當(dāng)前對(duì)象中,依賴對(duì)象的控制權(quán)不再由當(dāng)前類控制了.
這樣的話, 即使依賴類發(fā)?任何改變,當(dāng)前類都是不受影響的,這就是典型的控制反轉(zhuǎn),也就是 IoC 的實(shí)現(xiàn)思想。

到這?, 我們?概就知道了什么是控制反轉(zhuǎn)了, 那什么是控制反轉(zhuǎn)容器呢, 也就是IoC容器。

這部分代碼, 就是IoC容器做的?作.
從上?也可以看出來(lái), IoC容器具備以下優(yōu)點(diǎn):
資源不由使?資源的雙?管理,?由不使?資源的第三?管理,這可以帶來(lái)很多好處。

第?,資源集中管理,實(shí)現(xiàn)資源的可配置和易管理。

第?,降低了使?資源雙?的依賴程度,也就是我們說(shuō)的耦合度。

1. 資源集中管理: IoC容器會(huì)幫我們管理?些資源(對(duì)象等), 我們需要使?時(shí), 只需要從IoC容器中去取就可以了
2. 我們?cè)趧?chuàng)建實(shí)例的時(shí)候不需要了解其中的細(xì)節(jié), 降低了使?資源雙?的依賴程度, 也就是耦合度.

Spring 就是?種IoC容器, 幫助我們來(lái)做了這些資源管理. 

DI

DI: Dependency Injection(依賴注?)
容器在運(yùn)?期間, 動(dòng)態(tài)的為應(yīng)?程序提供運(yùn)?時(shí)所依賴的資源,稱之為依賴注?。

程序運(yùn)?時(shí)需要某個(gè)資源,此時(shí)容器就為其提供這個(gè)資源.

從這點(diǎn)來(lái)看, 依賴注?(DI)和控制反轉(zhuǎn)(IoC)是從不同的?度的描述的同?件事情,就是指通過(guò)引? IoC 容器,利?依賴關(guān)系注?的?式,實(shí)現(xiàn)對(duì)象之間的解耦。

前面代碼中, 是通過(guò)構(gòu)造函數(shù)的?式, 把依賴對(duì)象注?到需要使?的對(duì)象中的。

IoC 是?種思想,也是"?標(biāo)", ?思想只是?種指導(dǎo)原則,最終還是要有可?的落地?案,? DI 就屬于具體的實(shí)現(xiàn)。所以也可以說(shuō), DI 是IoC的?種實(shí)現(xiàn).

到此這篇關(guān)于Spring IoC和DI深度解析的文章就介紹到這了,更多相關(guān)Spring IoC和DI內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用wait/notify實(shí)現(xiàn)線程間通信上篇

    Java使用wait/notify實(shí)現(xiàn)線程間通信上篇

    wait()和notify()是直接隸屬于Object類,也就是說(shuō)所有對(duì)象都擁有這一對(duì)方法,下面這篇文章主要給大家介紹了關(guān)于使用wait/notify實(shí)現(xiàn)線程間通信的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 深入理解Java基礎(chǔ)中的集合框架

    深入理解Java基礎(chǔ)中的集合框架

    Java集合框架(Java Collections Framework, JCF)也稱容器,這里可以類比 C++中的 STL,在這里主要對(duì)如下部分進(jìn)行源碼分析,及在面試中常見(jiàn)的問(wèn)題,例如,在阿里面試常問(wèn)到的 HashMap和ConcurrentHashMap原理等等,深入源碼分析是面試中必備的技能
    2023-08-08
  • 關(guān)于RedisTemplate之opsForValue的使用說(shuō)明

    關(guān)于RedisTemplate之opsForValue的使用說(shuō)明

    這篇文章主要介紹了關(guān)于RedisTemplate之opsForValue的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java面向?qū)ο箨P(guān)鍵字extends繼承的深入講解

    Java面向?qū)ο箨P(guān)鍵字extends繼承的深入講解

    繼承就是使用已定義的類作為父類,新建一個(gè)類作為子類使用extends關(guān)鍵字繼承這個(gè)類,這樣就實(shí)現(xiàn)了繼承關(guān)系,這篇文章主要給大家介紹了關(guān)于Java面向?qū)ο箨P(guān)鍵字extends繼承的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot 下集成緩存工具類 CacheManager

    SpringBoot 下集成緩存工具類 CacheManager

    這篇文章主要介紹了Springboot下集成緩存工具類CacheManager,想進(jìn)一步了解相關(guān)知識(shí)的同學(xué),可以詳細(xì)閱讀本文
    2023-03-03
  • Java 分析并解決內(nèi)存泄漏的實(shí)例

    Java 分析并解決內(nèi)存泄漏的實(shí)例

    這篇文章主要介紹了Java 分析并解決內(nèi)存泄漏的實(shí)例,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • Springboot之@Async不執(zhí)行原因及分析

    Springboot之@Async不執(zhí)行原因及分析

    這篇文章主要介紹了Springboot之@Async不執(zhí)行原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • mybatis注入Date日期值為null的解決方法

    mybatis注入Date日期值為null的解決方法

    這篇文章主要給大家介紹了關(guān)于mybatis注入Date日期值為null的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比

    淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比

    這篇文章主要介紹了淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比,消息中間件屬于分布式系統(tǒng)中一個(gè)字系統(tǒng),關(guān)注于數(shù)據(jù)的發(fā)送和接收,利用高效可靠的異步信息傳遞機(jī)制對(duì)分布式系統(tǒng)中的其余各個(gè)子系統(tǒng)進(jìn)行集成,需要的朋友可以參考下
    2023-05-05
  • Springboot項(xiàng)目編寫(xiě)測(cè)試單元完整步驟記錄

    Springboot項(xiàng)目編寫(xiě)測(cè)試單元完整步驟記錄

    這篇文章主要介紹了如何使用JUnit編寫(xiě)Spring?Boot項(xiàng)目中的測(cè)試單元,包括引入依賴、配置文件設(shè)置、啟動(dòng)文件創(chuàng)建以及編寫(xiě)測(cè)試類的步驟,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評(píng)論

贵州省| 永春县| 丽水市| 蒙阴县| 邵阳县| 珠海市| 沁阳市| 商洛市| 永丰县| 伊金霍洛旗| 苍山县| 哈巴河县| 大足县| 禄丰县| 太原市| 临猗县| 开鲁县| 中阳县| 五大连池市| 富顺县| 宜州市| 汝城县| 砀山县| 张家口市| 临西县| 镇宁| 扎兰屯市| 临澧县| 金寨县| 内丘县| 金沙县| 湘潭市| 怀仁县| 宣汉县| 亳州市| 阿合奇县| 大新县| 泰来县| 天气| 兴宁市| 资兴市|