您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Spring依賴注入的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一個典型的企業應用程序不是由一個單一的對象組成(或Spring的說法中的bean)。即使是最簡單的應用程序也只有幾個對象一起工作來呈現最終用戶看作是一個連貫的應用程序。如何從定義許多獨立的bean定義到完全實現的應用程序,在這些應用程序中對象協作實現目標。
有關spring的設計模式和應用詳情可以參考我這篇文章《spring常用設計模式及應用》
依賴注入(DI)是一個過程,通過這個過程,對象可以通過構造函數參數,工廠方法的參數或者在構造或返回對象實例后設置的屬性來定義它們的依賴關系從工廠方法。然后容器在創建bean時注入這些依賴關系。這個過程從根本上說是相反的,因此名為控制反轉(IoC),它本身通過使用類的直接構造或服務定位符模式來控制它自己的依賴關系的實例化或位置。
代碼與DI原則相比更加清晰,當對象提供依賴時,解耦更為有效。該對象不查找它的依賴關系,不知道依賴關系的位置或類。因此,您的類變得更容易測試,特別是當依賴關系在接口或抽象基類上時,它們允許在單元測試中使用存根或模擬實現。
DI存在兩種主要的變體,基于構造函數的依賴注入和基于Setter的依賴注入。
基于構造器的 DI通過容器調用具有多個參數的構造器來完成,每個參數表示一個依賴關系。調用static具有特定參數的工廠方法來構造這個bean幾乎是等價的,而且這個討論同樣將參數作為構造函數和static工廠方法來處理。以下示例顯示了只能通過構造函數注入進行依賴注入的類。請注意,這個類沒有什么特別之處,它是一個POJO,它不依賴于容器特定的接口,基類或注釋。
public class SimpleMovieLister {
private MovieFinder movieFinder; public SimpleMovieLister(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
構造函數參數解析匹配使用參數的類型進行。如果bean定義的構造函數參數中沒有潛在的歧義,那么bean定義中定義構造函數參數的順序就是在實例化bean時將這些參數提供給適當構造函數的順序。
package x.y;
public class Foo { public Foo(Bar bar, Baz baz) { // ... } }
沒有潛在的歧義存在,假設Bar和Baz不是繼承關系。因此,以下配置好,你不需要指定構造器參數指標明確在<constructor-arg> 索引,類型或類型。
<beans>
<bean id="foo" class="x.y.Foo"> <constructor-arg ref="bar"/> <constructor-arg ref="baz"/> </bean> <bean id="bar" class="x.y.Bar"/> <bean id="baz" class="x.y.Baz"/> </beans>
在前面的場景中,如果使用類型屬性顯式地指定構造函數參數的類型,容器可以使用與簡單類型的類型匹配。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/> <constructor-arg type="java.lang.String" value="42"/> </bean>
使用索引屬性指定顯式構造函數參數的指數。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/> <constructor-arg index="1" value="42"/> </bean>同樣也可以使用構造器參數名稱匹配
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/> <constructor-arg name="ultimateAnswer" value="42"/> </bean>
在調用無參數構造函數或無參數靜態工廠方法實例化bean時,基于bean的調用Setter方法是通過bean調用Setter方法完成的。
public class SimpleMovieLister {
private MovieFinder movieFinder; public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
Spring團隊通常提倡構造函數注入,因為它使一個能夠將應用程序組件作為不可變對象實現,并確保所需的依賴項不是null。此外,構造函數注入的組件總是返回到完全初始化狀態的客戶機(調用)代碼中。作為一個方面說明,大量的構造函數的參數是一個糟糕的代碼的氣味,這意味著類可能有太多的責任和應該被更好的問題解決的適當分離。
Setter注入應該主要用于可選的依賴關系,這些依賴關系可以在類中分配合理的默認值。否則,非空檢查必須在代碼使用依賴項的任何地方執行。第=一個優勢就是在于setter方法使該類的對象能夠重新配置或重新注入。因此通過JMX MBean管理是setter注入一個引人注目的用例.
感謝各位的閱讀!關于“Spring依賴注入的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。