Ioc和Aop底層原理


Spring中主要用到的設計模式有工廠模式和代理模式。

IOC:Inversion of Control控制反轉,也叫依賴注入,通過 sessionfactory 去注入實例;IOC就是一個生產和管理bean的容器就行了,原來需要在調用類中new的東西,現在都是通過容器生成,同時,要是產生的是單例的bean,他還可以給管理bean的生命周期;通過注解配置或者進行xml配置實現,如@Controller,@Service,@Repository等注解配置

AOP:面向切面編程,可以將一些系統性相關的編程工作,獨立提取出來,獨立實現,然后通過切面切入進系統,從而避免了在業務邏輯的代碼中混入很多的系統相關的邏輯,比如安全,日志,事務功能;也可以通過注解配置或者進行xml配置實現,如@Aspect ,@Before,@After等或<aop config/>注解配置;主要是JDK動態代理和cglib動態代理

Spring的AOP和IOC都是為了解決系統代碼耦合度過高的問題,使代碼重用度高,易於維護。

 

一、Ioc :通過Spring配置來創建對象,而不是new的方式

兩種方法:配置文件,注解

1.Ioc底層原理

(1)xml配置文件

(2)dom4j解析

(3)工廠設計模式

(4)反射

步驟:

第一步:創建類的.xml文件

<bean id="userService" class="....."/>

第二步:創建一個工廠類:使用dom4j解析配置文件+反射

public class UserFactory{
    public static UserService getUserService(){

        //使用dom4j解析配置文件
        //根據id值userService,得到id值對應class的屬性值
        String classValue="userService"//使用反射來創建class對象
        Class class=Class.forName(classValue);
        UserService service=class.newInstatnce();
        return service;
    }
} 

通過IOC,我們如果改掉UserService類,只需更改bean里面的配置屬性就行了,降低了類之間的耦合度

 

2.Ioc和DI的區別:

(1)Ioc:控制反轉,把創建對象交給Spring進行配置

(2)DI:依賴注入,向類里面的屬性中設置值

(3)二者關系:DI不能單獨存在,要在Ioc基礎之上來完成操作,即要先創建對象才能注入屬性值。

 

3.Spring整合web項目原理

(1)加載Spring核心配置文件

  ApplicationContext context=new ClassPathXmlApplicationContext(“bean1.xml”);

  加載文件要new一個對象,每次訪問都要new對象加載配置,效率低

(2)實現思想:吧加載配置文件和創建對象過程,在服務器啟動時候完成

(3)實現原理:

  a) ServletContext對象

  b) 監聽器(ServletContextListener接口)

  c) 具體使用:

    i. 服務器啟動時,為每個項目創建一個ServletContext對象

    ii. 使用監聽器可以監聽到ServletContext在何時創建

    iii. 在監聽器的,ServletContextListener接口的contextInitialized()方法方法中加載Spring配置文件(括號1中代碼),創建對象。

    iv. 把創建出來的對象放到ServletContext域對象里面(setAttribute方法)

    v. 獲取對象時,從ServletContext域對象中得到(getAttribute方法)

 

二、Aop:面向切面,擴展功能時不通過源代碼,橫向抽取機制。

底層使用動態代理方式---增強方法

具體分兩種情況:

(1)有接口的情況:創建接口的實現類的代理對象,jdk動態代理(由java的反射機制實現,對實現了接口的類產生代理,需要實現 InvocationHandler 接口,並實現 invoke() 方法)

(2)沒有接口的情況:創建User類的子類的代理對象,cglib動態代理(借助 asm 來實現的,對沒有實現接口的類產生代理,生產子類對象,需要實現 MethodInterceptor 接口,實現 intercepter 方法)。子類可以通過super調用父類方法

增強:before,after,(前置,后置,異常,最終,環繞增強)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM