控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。spring
其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。編程
第一種:經過容器完成依賴關係的注入框架
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" 函數
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" this
xmlns:p="http://www.springframework.org/schema/p"spa
xsi:schemaLocation="http://www.springframework.org/schema/beans 設計
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> xml
<實現類實例化--> 對象
<bean id="geli" class="LiuDeHua"/> 接口
<bean id="moAttack" class="com.baotao.ioc.MoAttack"
p:geli-ref="geli"/><!--經過geli-ref創建依賴關係-->
</beans>
屬性注入的方式介紹(三種方式)
在spring框架裏面僅支持1.2.方法。
方法一:屬性的set方法(最多使用)
方法二:帶參數的構造方法
方法三:使用接口注入(較少用)
public class MoAttack {
private GeLi geli;
//屬性注入方法
public void setGeli(GeLi geli) {
this.geli = geli;
}
public void cityGateAsk() {
geli.responseAsk("消費者");
}
}
--------------------------------------------------------------------------------------------------MoAttack爲geli屬性提供一個Setter方法,以便讓導演在須要時注入geli的具體扮演者
Director:經過Setter方法注入提供者public class Director {
public void direct(){
GeLi geli = new LiuDeHua();
MoAttack moAttack = new MoAttack();
//調用屬性Setter方法注入
moAttack.setGeli(geli);
moAttack.cityGateAsk();
}
}
將調用類全部依賴注入的方法抽取到一個接口中,調用類經過實現該接口提供相應的注入方法。爲了採起接口注入的方式,必須先聲明一個Arrangable接口:public interface Arrangable {
void injectGeli(GeLi geli);
} ---------------------------------------------------------------------------------------------------------------
而後,MoAttack實現Arrangable接口提供具體的實現public class MoAttack implements Arrangable {
private GeLi geli;
//實現接口方法
public void injectGeli (GeLi geli) {
this.geli = geli;
}
public void cityGateAsk() {
geli.responseAsk("消費者");
}
}
明確ioc 的做用:
削減計算機程序的耦合(解除咱們代碼中的依賴關係。
一、高富帥IOC解剖
二、 設置資源加載器和資源定位:
(1)AbstractApplicationContext的refresh函數載入Bean定義過程
(2)AbstractApplicationContext子類的refreshBeanFactory()方法
(3)AbstractRefreshableApplicationContext子類的loadBeanDefinitions方法
(4)AbstractBeanDefinitionReader讀取Bean定義資源
三、資源加載器獲取要讀入的資源:
(1)XmlBeanDefinitionReader加載Bean定義資源
(2)DocumentLoader將Bean定義資源轉換爲Document對象
(3)XmlBeanDefinitionReader解析載入的Bean定義資源文件
(4)DefaultBeanDefinitionDocumentReader對Bean定義的Document對象解析
四、BeanDefinitionParserDelegate解析Bean定義資源文件中的<Bean>元素
(1)BeanDefinitionParserDelegate解析<property>元素
(2)解析元素的子元素
(3)解析子元素
五、解析事後的BeanDefinition在IoC容器中的註冊:
DefaultListableBeanFactory向IoC容器註冊解析後的BeanDefinition
一、介紹
二、Spring IoC容器的lazy-init屬性實現預實例化:
(1).refresh()
(2).finishBeanFactoryInitialization處理預實例化Bean
(3).DefaultListableBeanFactory對配置lazy-init屬性單態Bean的預實例化
三、FactoryBean的實現:
(1).FactoryBean的源碼以下
(2).AbstractBeanFactory的getBean方法調用FactoryBean
(3).AbstractBeanFactory生產Bean實例對象
(4).工廠Bean的實現類getObject方法建立Bean實例對象
4.BeanPostProcessor後置處理器的實現:
(1).BeanPostProcessor的源碼以下
(2).AbstractAutowireCapableBeanFactory類對容器生成的Bean添加後置處理器
(3).initializeBean方法爲容器產生的Bean實例對象添加BeanPostProcessor後置處理器
(4).AdvisorAdapterRegistrationManager在Bean對象初始化後註冊通知適配器
5.Spring IoC容器autowiring實現原理:
(1).AbstractAutoWireCapableBeanFactory對Bean實例進行屬性依賴注入
(2).Spring IoC容器根據Bean名稱或者類型進行autowiring自動依賴注入
(3).DefaultSingletonBeanRegistry的registerDependentBean方法對屬性注入
-END-