1. 程式人生 > >Spring框架的兩個重要概念IOC 和 AOP

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="

age"  value="23"></entry>

</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