前言
之前在學習一中就有提到AoP的作用,但並沒有深入理解。
現在開始深入一下AOP
AOP被稱爲面向切面,二切面也有目標——它必須要完成的工作。在AOP術語中,切面的工作被稱爲通知。
AOP是動態代理(這裏提一下九就好,不然理論太抽象,不懂)
使用AspectJ來實現切面
代碼實現
之前學習了bean裝配,代碼在這邊就不解釋了
spring 深入學習(二)–Bean裝配(代碼測試)
首先有一個接口
public interface IBase {
void play();
}
裝配輸出一下
package cn.entity;
import org.springframework.stereotype.Component;
@Component
public class staff implements IBase {
private String name = "小王";
@Override
public void play(){
System.out.println("name:"+name);
}
}
定義切面
這些註解需要一個依賴包org.aspectj.lang.annotation.*;
ALt+enter導入就行
使用@Aspect來定義切面
切點
通知方法
**
* @After 通知方法會在目標方法返回或拋出異常後調用
* @AfterReturning 通知方法會在目標方法返回後調用
* @AfterThrowing 通知方法會在目標方法拋出異常後調用
* @Around 通知方法會將目標方法封裝起來
* @Before 通知方法會在目標方法調用之前執行
* **
代碼
@Aspect
@Component
public class AopConfig {
// 通過@Pointcut註解聲明頻繁使用的切點表達式
@Pointcut("execution(* cn.entity.IBase.play(..))")
public void play(){}
@Before("play()")
public void hello(){
System.out.println("hello");
}
@AfterReturning("play()")
public void godBye(){
System.out.println("godBye");
}
}
@Component聲明這也是一個bean,能被識別到
需要注意的是,除了註解和沒有實際操作的play()方法,AOPConfig類依然是一個POJO。我們能夠像使用其他的Java類那樣調用 它的方法,它的方法也能夠獨立地進行單元測試,這與其他的Java類並沒有什麼區別。AOPConfig只是一個Java類,只不過它通過註解表明會 作爲切面使用而已。
如果你就此止步的話,AOPConfig只會是Spring容器中的一個bean。即便使用了AspectJ註解,但它並不會被視爲切面,這些註解不會解析, 也不會創建將其轉換爲切面的代理。
代理
如果你使用JavaConfig的話,可以在配置類的類級別上通過使用EnableAspectJ-AutoProxy註解啓用自動代理功能。下
面展現lJavaConfig中啓用自動代理。
@ComponentScan
@EnableAspectJAutoProxy
public class staffConfig {
}
測試
代碼與之前沒什麼不同
看一下結果在輸出
name之前與之後都要
AOPConfig方法輸出,這就是AOP代理的作用,當然這也是一個基礎的作用
當然他的方法還不只這些還有環繞什麼的,這裏只介紹的通過java配置,理解AOP的實現方式。