Spring框架的兩個重要概念IOC 和 AOP
背景:Spring框架,是專案管理框架,它主要是為javaEE開發提供更好的解決方案;
定義:Spring ,是IOC容器.
Spring兩大重量級概念:控制反轉 IOC Inverse Of Control 和 面向切面程式設計 AOP Aspect Oriented Programming
1.控制反轉
定義:控制反轉,反轉屬性的賦值權,將屬性的賦值,從原來程式碼中直接賦值,反轉到配置檔案中,通過配置,進而滿足雙方的依賴關係;
目的:將原來具有依賴關係的雙方,耦合打散,使的整個專案中元件之間的,既可以正常協作,又關係鬆散,使得整個專案更加,便於維護,使得系統更加穩健;
實現手段:在配置檔案中為bean 的屬性進行賦值,也就是所謂的依賴注入 Dependency Injection;
依賴注入的方式一般三種:
1.藉助set方法為屬性進行賦值
基本屬性:
<bean id="唯一標識" class="全限定名.類名">
<!--基本屬性-->
<property name="name" value="tom"></property>
<!--物件型別-->
<property name="user" ref="userOne"/>
<!--陣列或者集合-->
<property name="nameList">
<list>
<value>true</value>
<value>jack</value>
<value>32</value>
</list>
</property>
<!--map-->
<property name="myMap">
<map>
<entry key="name" value="jim"></entry>
<entry key="
</map>
</property>
<!--properties-->
<property name="props">
<props>
<prop key="url">jdbc:orace</prop>
<prop key=“name”>root<prop>
</props>
</property>
</bean>
2.構造注入,通過構造方法為屬性賦值
<bean id="constructor" class="......">
<constructor-arg name="name" value="b"></constructor-arg>.
<constructor-arg name="age" value="23"></constructor-arg>.
</bean>
構造注入,是高內聚的體現,使用於物件在建立時候就賦值,且後續不允許修改
3.自動注入
自動注入分兩種,一種按型別注入,一種按名稱注入。
按型別注入,就是將IOC工程中,與此元件同類型的元件注入給此元件,如果工廠中存在多個同類的元件,則會丟擲異常;
按名稱注入,就是將元件屬性同名的元件注入給此元件。
擴充套件:
1.bean的宣告週期是怎麼樣的?
工廠中的bean,工廠中的單例bean,會隨著工廠的啟動而建立,非單例bean,會在每次使用的時候,才會建立。
工廠中的bean,是在工廠關閉的時候,銷燬。
因此,bean的整個宣告歷程,構造--set--init--銷燬
2.bean的生成原理:反射——空參構造,例外,如果是使用構造注入,則選用指定的構造方法;
3.bean的銷燬方法和bean的初始化方法
<bean id="" class="" destroy-method="自定義銷燬方法" >
</bean>
<bean id="" class="" destroy-method="自定義初始化方法" >
</bean>
4.bean的建立模式<bean id="" class="" scope="singleton" > 單例模式
</bean>
<bean id="" class="" scope="prototype" > 非單例模式
</bean>
5.複雜物件的建立;
5.1定製FactoryBean 在其中定製複雜物件的建立流程
public class TestFactory implements FactoryBean<SessionFactory>{
/**
* 主體邏輯 用於定製複雜物件的生產流程
*/
@Override
public SessionFactory getObject() throws Exception {
Configuration cfg=new Configuration().configure();
return cfg.buildSessionFactory();
}
/**
* 返回類物件
*/
@Override
public Class getObjectType() {
return SessionFactory.class;
}
/**
* 設定複雜物件的建立模式:單例/非單例
* return true;單例
* return false;非單例
*/
@Override
public boolean isSingleton() {
return true;
}
}
5.2 配置
<!--聲明覆雜物件-->
<bean id="" class="">
</bean>
5.3使用時,從工廠中獲得bean,如果此bean是一個FactoryBean,則返回的不是該bean本身的物件,而是需要呼叫其getObject(),得到返回值給使用者
2、AOP面向切面程式設計
背景:在日常業務層中,有兩個邏輯:額外功能 和 核心業務,穩定的核心業務和不穩定的額外功能經常耦合在一起, 在多個業務功能,額外功能也會出現大量的冗餘。
面向切面程式設計本質是使用代理模式,代理類的方式,實現核心業務功能和額外功能的靈活組裝;
Aop定義:,就是通過adivce的介入,將核心業務的額外功能抽取出來,定製為單獨元件,使得業務層中,核心業務和額外功能的耦合被打散,且消除額外功能的耦合。
代理最終解決了耦合和冗餘問題;
代理分靜態代理,動態代理;
動態代理的生成原理:反射生成機制:
*JDK代理機制:通過實現介面的方式,約束代理和目標有同樣的功能實現。
*CGLIB代理機制:通過繼承目標的方式,約束代理和目標有同樣的功能實現。
*spring會判斷目標中是否有介面實現,如果有則使用jdk,否則使用cglib