AOP
什麼是AOP
百度百科:在軟件業,AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
實現原理
在JAVA中,AOP使用動態代理實現,而動態代理實現方式分爲兩種:
- 以JDK動態代理爲代表的基於接口的動態代理
- 以CGLIB爲代表的基於父類的動態代理
更多關於AOP的內容可以參考之前的文章:
AOP的作用
AOP術語
-
通知(Advice):所謂通知是指攔截到Joinpoint之後所要做的事情就是通知
- 前置通知(before):執行前執行
- 後置通知(after):執行後執行
- 返回通知(after returning)
- 異常通知(after throwing)
- 環繞通知(around)
使用xml時,後置通知與返回通知以及異常通知的執行順序取決於配置順序
- 連接點(Joinpoint):所謂連接點是指那些被攔截到的點。在spring中,這些點指的是方法,因爲spring只支持方法類型的連接點。
- 切點(Pointcut):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義。
- 切面(Aspect):是切入點和通知(引介)的結合。
- 引入(Introduction):引介是一種特殊的通知在不修改類代碼的前提下, Introduction可以在運行期爲類動態地添加一些方法或Field。
- 織入(Weaving):是指把增強應用到目標對象來創建新的代理對象的過程。
使用AOP
使用AOP之前,我們需要引入相關的依賴:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
並且要在配置中開啓
@EnableAspectJAutoProxy
@Aspect
@Component //定義一個切面組件,注入給Spring容器管理
public class MyAspect {
// 定義一個切點
@Pointcut("execution(* wang.ismy.spring.Bean.run())")
public void point(){}
// 使用該節點編寫前置通知
@Before("point()")
public void before(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature().getName());
}
}
這樣,當Bean執行run方法之前,它總是會調用before方法。
切點不僅能使用execution編寫,而且還能用如下方法編寫:
詳情請參考Spring文檔: 5.2.0文檔
總結
AOP是建立在DI上的一個重要功能,Spring的很多重要功能譬如事務管理都是建立在AOP上的,理解AOP及其原理能更好地使用Spring框架。