中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java程序員必須掌握的Spring依賴管理原理

發布時間:2020-07-31 06:42:40 來源:網絡 閱讀:891 作者:Java_老男孩 欄目:編程語言

Spring依賴注入

依賴注入(Dependency Injection)的意思就是對象通過構造器函數參數,工廠方法的參數,或者成員屬性,定義了對象的依賴對象;容器在創建該對象時會負責注入這些依賴。這個過程是控制反轉的,即不是由即將創建的對象來管理自己的依賴的發現和實例化,而是有Spring容器來實現。

在Spring中依賴注入有兩種形式,第一種就是基于構造函數的注入,即通過調用構造函數,傳入參數,也就是依賴來完成整個依賴注入流程;第二種就是基于setter方法的注入

構造函數的參數的匹配,要避免歧義,如指定類型,指定參數的次序等。如果是按照參數名字匹配,則必須開啟debug模式進行編譯,否則參數名字是不保留的。如果不想開啟debug模式編譯,則可以使用@ConstructorProperties注解
setter方法注入是先調用沒有參數的默認構造函數構建對象,或者沒有參數的靜態工廠方法,實例化bean后,調用setter方法來將該對象注入。

通過使用依賴注入,可以使代碼更簡潔,更好地實現對象之間解耦。另外,通過依賴注入管理的的對象是POJO類,可以更好地進行測試。

如何選擇合適的依賴注入方法?

最佳實踐是通過構造器方法注入主要依賴對象,通過setter方法注入可選的依賴對象。雖然可以在setter方法上加上@Required注解來實現主要依賴對象注入,但一般還是推薦使用構造器注入必須的依賴。

使用構造器注入,可以使得應用的組件作為不可變的對象,而且可以保證注入依賴是非null的。另外,構造器注入返回的是一個完整的初始狀態的實例。但是,一般不推薦大量使用構造方法注入,如果出現這種情況,則說明代碼需要重構。

setter方法適合注入可選的依賴,這些依賴可能有默認值,而且在其他位置使用這些依賴時務必要進行null值檢查。使用setter方法的一個好處是可以修改或者重新配置,或者需要時再注入。如基于JMX MBean的管理。

Spring依賴解析流程

首先ApplicationContext會被創建和初始化,會加載包括描述所有bean的元數據。這些配置元數據可以通過XML,Java代碼或者注解來指定。

對于每一個bean,它的依賴表現形式是成員屬性,構造器參數,或者靜態工廠方法的參數。在bean真正創建時,Spring容器會提供這些依賴的對象。這些參數可能是需要設置的默認值,也可能是另外一個bean的引用。

Spring容器會驗證每個bean的配置信息。并且在bean真正創建時才設置設置屬性值或者參數值。
在Spring中,單例作用域的bean會提前初始化,在Spring容器創建時就進行了實例化。對于其他的作用域的bean,則只在需要時才進行創建。之所以單例作用域的bean會被提前初始化,主要是為了解決依賴檢查的問題,下文的循環依賴一節會詳細說明。

在Spring內部會構建一個創建bean的依賴圖,按照這依賴關系來創建Bean。

循環依賴解決

如果使用構造函數注入,則不能有循環依賴的情況。如A構造器依賴B,同時B也構造器依賴A。Spring IoC容器會在運行時檢測到循環依賴,拋BeanCurrentlyInCreationException異常。一種解決辦法是通過setter方法來解決循環依賴的情況。

Spring會在容器加載時檢測配置問題,如引用不存在或者循環依賴。Spring會在必要時才解析依賴,即盡可能晚的來解析依賴關系。延遲解析依賴可能導致后期請求獲取對象時報錯,如拋出一個異常,如丟失指定對象或者屬性。這種配置的延遲的可見性導致的問題使得ApplicationContext的實現要求單例作用域的bean提前記性初始化。雖然會耗費內存和時間,因為并不是按需創建這些單例作用域的bean,但是可以在ApplicationContext創建時就可以發現配置問題。

下文會介紹通過指定bean的可以通過配置來覆蓋默認的行為,使得單例作用域的bean也是延遲初始化。
如果沒有循環依賴存在,則在注入依賴對象時,這些依賴的對象就已經初始化完成了。即如果A依賴B,則在A初始化時,B已經初始化完成了。也就是說,Bean是在相關依賴設置完成,并且相關的生命周期方法調用完畢后,才算是完成了初始化。

bean的延遲初始化

默認情況下ApplicationContext是提前初始化單例作用域的bean,作為ApplicationContext初始化的一部分。這樣可以盡快的發現配置問題。可以通過指定bean的lazy-init="true",讓bean在需要時才被初始化。

自動注入依賴

在Spring中可以自動注入依賴,可以減少指定屬性或者構造器參數,還可以隨著配置對象的變化來更新注入的對象。
自動注入依賴的模式有:通過名稱注入,通過類型注入,和通過構造器注入

總結

本文總結了Spring中的依賴管理的基本原理和常見的問題,具體的依賴注入配置語法還需要參考Spring的官方文檔來進行。


文末彩蛋

針對于上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以后會有更多干貨分享。

資料獲取方式 QQ群搜索“708-701-457” 即可免費領取

Java程序員必須掌握的Spring依賴管理原理
Java程序員必須掌握的Spring依賴管理原理
Java程序員必須掌握的Spring依賴管理原理

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汨罗市| 汉源县| 师宗县| 孟州市| 饶平县| 盱眙县| 抚宁县| 岑溪市| 烟台市| 鞍山市| 安龙县| 新昌县| 湾仔区| 瑞昌市| 噶尔县| 海安县| 安西县| 讷河市| 达州市| 日土县| 香河县| 本溪市| 大英县| 景宁| 伊通| 双鸭山市| 武汉市| 金沙县| 怀集县| 盘锦市| 中卫市| 会宁县| 清流县| 舟山市| 永新县| 巴楚县| 敦化市| 泰宁县| 岑巩县| 南召县| 永寿县|