1. 程式人生 > >Spring Framework之IoC容器

Spring Framework之IoC容器

[toc]

## Spring IoC 概述 ### 問題 1.什麼是依賴倒置? 2.什麼是控制反轉? 3.什麼是依賴注入? 4.它們之間的關係是怎樣的? 5.優點有哪些? ### 依賴倒置原則 (Dependency Inversion Principle) ​ **依賴倒置是一種設計原則。** ​ 依賴倒置包括三層含義:(1)高層模組不應該直接依賴於底層模組,兩者都應依賴其抽象;(2)抽象不應依賴於細節;(3)細節應該依賴於抽象。 ### 控制反轉 (Inversion of Control) ​ **控制反轉是一種思想。**其核心思想在於,合作的物件依賴關係的管理不由具體物件來完成,而是具體物件交出依賴關係的控制權,由第三方容器來集中管理。 ​ 第三方容器管理的優點:(1)依賴關係的集中管理,關係清晰且易管理;(2)降低合作物件之間的耦合程度。 ​ 舉個栗子。我想在北京租一間房子,我只需要把我的需求告知鏈家等中介公司,通過他們整合的資源,我就能夠找到一間符合我需求的房子。我不需要與房東產生任何直接的關係,中間的任何問題都由鏈家進行統一處理。在這個例子中,**房客與房東是兩個獨立的物件,而鏈家則是充當中間容器**。 ### 依賴注入(Dependency Inversion) ​ **依賴注入是控制反轉的具體方法之一。**依賴注入就是將底層依賴物件以引數形式傳入上層物件。 ​ 物件間的依賴關係的管理被反轉至IoC容器中。物件間的依賴關係由IoC容器進行統一管理,並由IoC容器來完成物件的注入。 ### 依賴倒置原則 、控制反轉 、依賴注入的關係
### 優點 1.實現模組間鬆耦合 2.由IoC容器來統一管理依賴關係,物件從複雜的依賴關係中解放。 3.物件自身弄夠專注於自身功能上,不需要了解依賴物件的內部結構。

## IoC 容器 ### BeanFactory ​ **BeanFactory提供最基本的IoC容器功能和基本規範。** ​ BeanFactory中有getBean、getType、getAliases、isSingleton、isPrototype等函式。主要常用介面是getBean,改函式能夠通過Bean名稱獲取Bean **BeanFactory擴充套件介面**: (1)ListableBeanFactory:介面定義Bean的基本資訊。 ​ 介面中函式有:getBeanDefinitionCount獲取Bean數量、containsBeanDefinition判斷容器中是否存在該Bean、getBeanDefinitionNames獲取工程所有Bean的名稱等。 (2)HierarchicalBeanFactory:父子容器關聯 ​ 介面中函式有:getParentBeanFactory子容器可以通過函式訪問到父容器 (3)ConfigurableBeanFactory:可定製IoC容器 ​ 介面中函式有:setBeanClassLoader設定Bean類載入器、setBeanExpressionResolver設定表示式解析器、registerCustomEditor註冊編輯器等。 (4)AutowireCapableBeanFactory:定義Bean自動裝配規則 ​ 介面中函式有:autowireBeanProperties根據名稱或屬性給Bean進行自動裝配等。 ### ApplicationContext
​ **ApplicationContext基於BeanFactory,是比BeanFactory更為高階的容器。** ​ ApplicationContext相對於BeanFactory提供更多功能,BeanFactory中需要通過程式設計實現的功能,ApplicationContext中可以使用配置來實現。 ​ ApplicationContext繼承ListableBeanFactory、HierarchicalBeanFactory,除此之外還擴充套件了其他介面。 **ApplicationContext擴充套件介面:** (1)ApplicationEventPublisher:封裝事件釋出功能。 (2)MessageSource:提供i18n國際化訊息剛問功能。(解釋模組中解釋i18n) (3)ResourcePatternResolver:通過路徑載入資源 (4)LifeCycle:start()、stop()、isRunning(),控制與判斷容器當前狀態,以達到控制與排程的作用。 (5)ConfigurableApplicationContext:實現ApplicationContext,新增refresh()、close(),使ApplicationContext具備啟動、重新整理、關閉等功能。

## IoC容器的依賴注入 ### 基於註解定義Bean ​ Spring2.0開始Spring提供基於註解的依賴注入功能。使用xml進行配置使Bean定義資訊與Bean實現程式碼分離,這就會造成程式碼複雜且易錯。基於註解就可以在Bean實現類上進行註解標註,這大大降低的程式碼的複雜性。 ​ 定義Bean註解有以下4中: ​ (1)@Component:元件 ​ (2)@Respository:對於Dao實現類進行標註 ​ (3)@Service:對於Service實現類進行標註 ​ (4)@Controller:對於Controller實現類進行標註 @Respository、@Service、@Controller是@Component的擴充套件,儘量使用3種特殊的註解,因為能夠標識出Bean的型別。 ### 自動裝配 #### @Resource ​ resource是用J2EE提供的。 ​ **查詢方式:** (1)按照指定name和type,容器中找到後對bean進行裝配,找不到丟擲異常。 (2)按照指定name,容器中找到後對bean進行裝配,找不到丟擲異常。 (3)按照指定type,容器中找到後對bean進行裝配,找不到或找到多個丟擲異常。 (4)沒指定name和type,則先安裝name方式裝配,找不到這則按type進行裝配,都沒有拋異常。 #### @Autowired ​ autowired是spring提供的。 ​ **查詢方式:** (1)按照型別查詢,如果該型別bean不唯一則拋異常。 #### @Qualifier ​ **查詢方式:** (1)通過名稱指定Bean,同一個介面有多個實現,我們要裝配其中某一個Bean時,可以用qualifier通過名稱直接指定,一般結合Autowired一起使用。 ### 基於Java類配置 #### @Bean ​ 普通的POJO可以通過標註@Configuration註解,就可以為Spring容器提供Bean定義資訊,標註了@Bean的類方法就相當於提供了Bean的定義資訊。當第三方庫引入時,可以使用@Bean註解將Bean交由Spring容器進行管理。 ```java @Configuration public class AppConfig { @Bean(name = "dataSource") public DataSource initDataSource() { return DataSourceBuilder.create().build(); } } ``` 相當於 ``` ```

## Bean的作用域 | 型別 | 說明 | | :---------------- | ----------------------------- | | **singleton** | IoC容器中僅存在一個Bean例項 | | **prototype** | 每次呼叫都會返回新的Bean例項 | | **request** | 每次Http請求都會建立一個Bean | | **session** | 同一個session共享Bean | | **globalSession** | 同一個全域性Session共享一個Bean | #### singleton
#### prototype

## FactoryBean ### 解釋說明 ​ FactoryBean是能夠生產和修飾物件生成的工廠Bean。Spring提供了org.springframework.beans.factory. Fac