天天看點

Spring學習筆記二:Spring的兩大核心IOC和AOPSpring的兩大核心IOC和AOP

Spring的兩大核心IOC和AOP

什麼是IOC?

Ioc—Inversion of Control即“控制反轉”,不是什麼技術,而是一種設計思想。

​ 了解好Ioc的關鍵是要明确“誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了。

​ 誰控制誰,控制什麼:傳統Java SE程式設計,我們直接在對象内部通過new進行建立對象,是程式主動去建立依賴對象;而IoC是有專門一個容器來建立這些對象,即由Ioc容器來控制對象的建立;誰控制誰?當然是IoC 容器控制了對象;控制什麼?那就是主要控制了外部資源的擷取(外部資源包括對象或者檔案)。補充說明:在傳統程式設計方式中,要實作某種功能一般的需要幾個對象互相作用。在主對象中要儲存其他類型對象的引用,以便在主對象中執行個體化對象,然後通過調用這些引用的方法來完成任務。而IOC容器是在主對象中設定Setter方法,通過調用Setter方法或者構造方法傳入所需的引用。

​ 為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程式是由我們自己在對象中主動控制去直接擷取依賴對象,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴對象;為何是反轉?因為由容器幫我們查找及注入依賴對象,對象隻是被動的接受依賴對象,是以是反轉;哪些方面反轉了?擷取依賴對象的方式被反轉了。

​ IoC 不是一種技術,隻是一種思想,一個重要的面向對象程式設計的法則,它能指導我們如何設計出松耦合、更優良的程式。

DI—Dependency Injection

即“依賴注入”:由容器動态的将某個依賴關系注入到元件之中。

DI≠IOC,DI是IOC的一種實作方式。IOC的另外一種實作方式是依賴查找

什麼是AOP?

AOP(Aspect-Oriented Programming,面向切面程式設計),可以說是OOP(Object-Oriented Programing,面向對象程式設計)的補充和完善。AOP把業務功能分為核心和非核心兩部分

  • 核心業務功能:使用者登入,添加資料,删除資料
  • 非核心業務功能:性能統計,日志,事務管理

​ AOP将那些影響了多個類的公共行為封裝到一個可重用子產品,并将其名為“Aspect”,即切面。所謂“切面”,簡單地說,就是将那些與業務無關,卻為業務子產品所共同調用的邏輯或責任封裝起來,便于減少系統的重複代碼,降低子產品間的耦合度,并有利于未來的可操作性和可維護性。

AOP中的概念

  • 切入點(pointcut):在那些類,那些方法上切入
  • 通知(advice):在方法前,方法後,方法前後做什麼

    Spring AOP 提供了5種類型的通知:

    • 前置通知(Before):在目标方法被調用之前調用通知功能。
    • 後置通知(After):在目标方法完成之後調用通知,無論該方法是否發生異常。
    • 後置傳回通知(After-returning):在目标方法成功執行之後調用通知。
    • 後置異常通知(After-throwing):在目标方法抛出異常後調用通知。
    • 環繞通知(Around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行為。
  • 切面(aspect):切面=切入點+通知。即在什麼時機,什麼地方,做什麼
  • 織入(weaving):織入描述的是把切面應用到目标對象來建立新的代理對象的過程。 Spring AOP 的切面是在運作時被織入,原理是使用了動态代理技術。Spring支援兩種方式生成代理對象:JDK動态代理和CGLib,預設的政策是如果目标類是接口,則使用JDK動态代理技術,否則使用Cglib來生成代理。
  • 連接配接點(Join point):連接配接點是在應用執行過程中能夠插入切面的一個點。這個點可以是類的某個方法調用前、調用後、方法抛出異常後等。切面代碼可以利用這些點插入到應用的正常流程之中,并添加行為。
  • 環繞通知:AOP中最強大最靈活的通知,它內建了前置和後置通知,保留了連接配接點原有的方法。