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

Java?Spring的核心與設(shè)計思想你知道嗎

 更新時間:2022年03月11日 10:54:25   作者:敲代碼的布萊恩特  
這篇文章主要為大家詳細(xì)介紹了Java?Spring的核心與設(shè)計思想,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

Spring是什么?

我們通常所說的 Spring 指的是 Spring Framework(Spring 框架),它是?個開源框架,有著活躍?龐 ?的社區(qū),這就是它之所以能?久不衰的原因。Spring ?持?泛的應(yīng)?場景,它可以讓 Java 企業(yè)級的 應(yīng)?程序開發(fā)起來更簡單。

??句話概括 Spring:Spring 是包含了眾多?具?法的 IoC 容器。

什么是容器?

容器是?來容納某種物品的(基本)裝置。 ——來?:百度百科

我們想想,之前課程我們接觸的容器有哪些?

  • List/Map -> 數(shù)據(jù)存儲容器
  • Tomcat -> Web 容器

什么是IoC?

Spring 也是?個容器,Spring 是什么容器呢?

Spring 是?個 IoC 容器。

什么是 IoC?

IoC = Inversion of Control 翻譯成中?是“控制反轉(zhuǎn)”的意思,也就是說 Spring 是?個“控制反轉(zhuǎn)”的容 器,怎么理解這句話呢,我們先從以下示例開始。

傳統(tǒng)程序開發(fā)

在這里插入圖片描述

構(gòu)建?輛?(Car Class),然??需要依賴?身(FrameWork Class),??身需要依賴底盤(Bottom Class),?底盤需要依賴輪胎(Tire Class),最終程序的實現(xiàn)代碼如下:

public class NewCarExample {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
   }
    /**
     * 汽?對象
     */
    static class Car {
        public void init() {
            // 依賴?身
            Framework framework = new Framework();
            framework.init();
       }
   }
    /**
     * ?身類
     */
    static class Framework {
        public void init() {
            // 依賴底盤
            Bottom bottom = new Bottom();
            bottom.init();
       }
   }
    /**
     * 底盤類
     */
    static class Bottom {
        public void init() {
            // 依賴輪胎
            Tire tire = new Tire();
            tire.init();
       }
   }
    /**
     * 輪胎類
     */
    static class Tire {
    // 尺?
        private int size = 30;
        public void init() {
            System.out.println("輪胎尺?:" + size);
       }
   }
}

傳統(tǒng)程序開發(fā)的缺陷:

以上程序中,輪胎的尺?的固定的,然?隨著對的?的需求量越來越?,個性化需求也會越來越多,這 時候我們就需要加?多種尺?的輪胎,那這個時候就要對上?的程序進(jìn)?修改了,修改后的代碼如下所 示:

public class NewCarUpdateExample {
    public static void main(String[] args) {
        Car car = new Car(20);
        car.run();
   }
    /**
     * 汽?對象
     */
    static class Car {
        private Framework framework;
        public Car(int size) {
            framework = new Framework(size);
       }
        public void run() {
            // 依賴?身
            framework.init();
       }
   }
    /**
     * ?身類
     */
    static class Framework {
        private Bottom bottom;
        public Framework(int size) {
            bottom = new Bottom(size);
       }
        public void init() {
            // 依賴底盤
            bottom.init();
       }
   }
    /**
     * 底盤類
     */
    static class Bottom {
        private Tire tire;
         public Bottom(int size) {
            tire = new Tire(size);
       }
        public void init() {
            // 依賴輪胎
            tire.init();
       }
   }
    /**
     * 輪胎類
     */
    static class Tire {
        // 尺?
        private int size;
        public Tire(int size) {
            this.size = size;
       }
        public void init() {
            System.out.println("輪胎尺?:" + size);
       }
   }
}

從以上代碼可以看出,以上程序的問題是:

當(dāng)最底層代碼 改動之后,整個調(diào)?鏈上的所有代碼都需要 修改。

如何解決上述問題呢?

解耦指的是解決了 代碼的耦合性,耦合性也可以換?種叫法叫程序相關(guān)性。好的程序代碼的耦合 性(代碼之間的相關(guān)性)是很低的,也就是代碼之間要實現(xiàn)解耦。

控制反轉(zhuǎn)式程序開發(fā)

基于以上思路,我們把調(diào)?汽?的程序示例改造?下,把創(chuàng)建?類的?式,改為注?傳遞的?式,具體 實現(xiàn)代碼如下:

public class IocCarExample {
    public static void main(String[] args) {
        Tire tire = new Tire(20);
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
   }
    static class Car {
        private Framework framework;
        public Car(Framework framework) {
            this.framework = framework;
       }
        public void run() {
            framework.init();
       }
   }
    static class Framework {
        private Bottom bottom;
        public Framework(Bottom bottom) {
            this.bottom = bottom;
       }
        public void init() {
            bottom.init();
       }
   }
    static class Bottom {
        private Tire tire;
        public Bottom(Tire tire) {
            this.tire = tire;
       }
        public void init() {
            tire.init();
       }
   }
    static class Tire {
        private int size;
        public Tire(int size) {
            this.size = size;
       }
        public void init() {
            System.out.println("輪胎:" + size);
       }
   }
}

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

兩種開發(fā)方式對比總結(jié)

在傳統(tǒng)的代碼中對象創(chuàng)建順序是:Car -> Framework -> Bottom -> Tire

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

在這里插入圖片描述

我們發(fā)現(xiàn)了?個規(guī)律:

通?程序的實現(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),不再是 上級對象創(chuàng)建并控制下級對象了,?是下級對象把注?將當(dāng)前對象中,下級的控制權(quán)不再由上級類控制 了,這樣即使下級類發(fā)?任何改變,當(dāng)前類都是不受影響的

這就是典型的控制反轉(zhuǎn),也就是 IoC 的實 現(xiàn)思想。

理解SpringIoC

回到我們的主題:Spring,本?剛開始咱們就講:Spring 是包含了多個?具?法的 IoC 容器,這就是 對 Spring 最核?的總結(jié)。“集成多個?具?法”這事咱們以后慢慢再講,那如何理解“Spring 是?個 IoC 容器”這句話呢?

既然 Spring 是?個 IoC(控制反轉(zhuǎn))容器,重點還在“容器”?字上,那么它就具備兩個最基礎(chǔ)的功能:

  • 將對象存?到容器;
  • 從容器中取出對象。

也就是說學(xué) Spring 最核?的功能,就是學(xué)如何將對象存?到 Spring 中,再從 Spring 中獲取對象的過 程。

將對象存放到容器中的好處:將對象存儲在 IoC 容器相當(dāng)于將以后可能?的所有?具制作好都放到倉 庫中,需要的時候直接取就?了,?完再把它放回到倉庫。? new 對象的?式相當(dāng)于,每次需要?具 了,才現(xiàn)做,?完就扔掉了也不會保存,下次再?的時候還得重新做,這就是 IoC 容器和普通程序開 發(fā)的區(qū)別。

Spring 是?個 IoC 容器,說的是對象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來管理了,它本身?具備了存 儲對象和獲取對象的能?。

DI 概念說明

說到 IoC 不得不提的?個詞就是“DI”,DI 是 Dependency Injection 的縮寫,翻譯成中?是“依賴注入”的意思。

所謂依賴注?,就是由 IoC 容器在運?期間,動態(tài)地將某種依賴關(guān)系注?到對象之中。所以,依 賴注?(DI)和控制反轉(zhuǎn)(IoC)是從不同的?度的描述的同?件事情,就是指通過引? IoC 容 器,利?依賴關(guān)系注?的?式,實現(xiàn)對象之間的解耦。

在這里插入圖片描述

IoC 是“?標(biāo)”也是?種思想,??標(biāo)和思想只是?種指導(dǎo)原則,最終還是要有可?的落地?案,? DI 就 屬于具體的實現(xiàn)。

面試問題總結(jié) 

Spring 是什么?如何理解 Spring?

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

Spring 是?個 IoC 容器,說的是對象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來管理了,它本身?具備了存 儲對象和獲取對象的能?。

IoC 和 DI 是啥?有什么區(qū)別?

IoC是控制反轉(zhuǎn),它是一種設(shè)計思想;DI控制反轉(zhuǎn),它是一種實現(xiàn)手段

Spring 最核?的功能是啥?

將對象存?到 Spring 中,再從 Spring 中獲取對象。

對象的創(chuàng)建和銷毀的權(quán)利都交給 Spring 來管理了,它本身?具備了存 儲對象和獲取對象的能?

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Spring中Bean有關(guān)NullPointerException異常的原因分析

    Spring中Bean有關(guān)NullPointerException異常的原因分析

    在Spring中使用@Autowired注解注入的bean不能在靜態(tài)上下文中訪問,否則會導(dǎo)致NullPointerException,解決方法包括避免在靜態(tài)方法中使用注入的bean,或者使用Spring的ApplicationContext來獲取bean,但后者不推薦
    2024-12-12
  • Spring Boot中配置文件application.properties使用

    Spring Boot中配置文件application.properties使用

    這篇文章主要介紹了Spring Boot中配置文件application.properties使用及spring boot讀取application.properties文件的方式,需要的朋友參考下吧
    2018-01-01
  • 關(guān)于Java中Json的各種處理

    關(guān)于Java中Json的各種處理

    這篇文章主要介紹了關(guān)于Java中Json的各種處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring注解 TX聲明式事務(wù)實現(xiàn)過程解析

    Spring注解 TX聲明式事務(wù)實現(xiàn)過程解析

    這篇文章主要介紹了Spring注解 - TX 聲明式事務(wù)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Spring Cloud原理詳解

    Spring Cloud原理詳解

    今天小編就為大家分享一篇關(guān)于Spring Cloud原理詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • springBoot+webMagic實現(xiàn)網(wǎng)站爬蟲的實例代碼

    springBoot+webMagic實現(xiàn)網(wǎng)站爬蟲的實例代碼

    這篇文章主要介紹了springBoot+webMagic實現(xiàn)網(wǎng)站爬蟲的實例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • springboot實現(xiàn)注冊加密與登錄解密功能(demo)

    springboot實現(xiàn)注冊加密與登錄解密功能(demo)

    這篇文章主要介紹了springboot實現(xiàn)注冊的加密與登錄的解密功能,本文通過demo實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Mybatis查詢時的延遲加載解析

    Mybatis查詢時的延遲加載解析

    這篇文章主要介紹了Mybatis查詢時的延遲加載解析,先從單表查詢,需要時再從關(guān)聯(lián)表去關(guān)聯(lián)查詢,能大大提高數(shù)據(jù)庫性能,因為查詢單表要比關(guān)聯(lián)查詢多張表速度要快,延遲加載分為兩種:深度延時加載,侵入式延遲加載,需要的朋友可以參考下
    2023-10-10
  • spring MVC搭建及配置詳解

    spring MVC搭建及配置詳解

    本篇文章主要介紹了spring MVC配置方法,要想靈活運用Spring MVC來應(yīng)對大多數(shù)的Web開發(fā),就必須要掌握它的配置及原理,有興趣的可以了解一下。
    2017-01-01
  • Spring CGLlB動態(tài)代理實現(xiàn)過程解析

    Spring CGLlB動態(tài)代理實現(xiàn)過程解析

    這篇文章主要介紹了Spring CGLlB動態(tài)代理實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10

最新評論

荃湾区| 商都县| 明星| 张掖市| 沁阳市| 利川市| 临沭县| 衡山县| 徐州市| 防城港市| 五原县| 濉溪县| 固安县| 凤台县| 保定市| 玉树县| 泸定县| 阜南县| 普兰店市| 屏边| 封丘县| 曲松县| 响水县| 麻江县| 阜平县| 政和县| 扎鲁特旗| 河津市| 封开县| 贵德县| 濮阳市| 鄢陵县| 安图县| 宜都市| 习水县| 安西县| 乳源| 安图县| 杭锦旗| 静宁县| 扎兰屯市|