前言:
AOP並不是Spring框架特有的。Spring只是支持AOP編程 (面向切面編程) 的框架之一。
概念:
1、切面(Aspect)
一系列Advice + Pointcut 的集合。
2、通知(Advice)
通知是切面開啟后,切面的方法。
- 前置通知 ( before ):在動態代理反射原有對象方法 或者 執行環繞通知 前 執行的通知功能
- 后置通知(after):在動態代理反射原有對象方法 或者 執行環繞通知 后 執行的通知功能
- 返回通知 (afterReturning):在動態代理反射原有對象方法 或者 執行環繞通知 后 正常返回(無異常)執行的通知功能
- 異常通知(afterTherowing):在動態代理反射原有對象方法 或者 執行環繞通知 產生異常后執行的通知功能
- 環繞通知(around):在動態代理中,它可以取代當前被攔截對象的方法,提供回調原有被攔截對象的方法
3、引入(Introduction)
引入允許我們在現有的類里添加自定義的類和方法
4、切點(Pointcut)
這是一個告訴Spring AOP 在什么時候啟動攔截並織入對應的流程,因為並不是所有的開發都是需要啟動AOP的,它往往通過正則表達進行限定
5、連接點( join point)
Pointcut 中的某個具體位置。
首先要有 AspectJ 的依賴

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
現在我們去創建一個Cat 類 (目標類)出來,並使用@Component 注入容器中
import org.springframework.stereotype.Component; //目標類 @Component public class Cat { public void eat(){ System.out.println("小白貓,開始吃魚了!!!!"); } }
然后再創一個 切面類 出來
@Component @Aspect public class CatAdvice {//切面類 //execution (* *.*(..) ) // 第一個* 代表着 返回類型是任意的 // 第二個* 代表着 類的全限定名 * 代表着所有 // *(..) 代表着 任意方法 任意的參數 // 比如 execution ( void com.oukele.learning.aop2.Cat.eat()) //切點 @Pointcut("execution(* *.*(..))") public void pointcut(){}; @Before("pointcut()") public void clean(){//在貓吃之前執行的方法 ,把魚清洗一下 (前置通知) System.out.println("現在我們把我這條魚,清洗一下"); } @After("pointcut()") public void tidy(){//貓吃完魚后執行的方法,收拾一下剩下的殘渣 (后置通知) System.out.println("收拾,小白貓吃剩下來的殘渣。!!!"); } }
再創一個配置類
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration//聲明當前類是配置類 ( 類似於 xml 文件一樣 ) @ComponentScan(basePackages = "com.oukele.learning.aop2")//掃描某個包中的注解 @EnableAspectJAutoProxy//激活 代理功能 public class SpringConfig { }
現在開始測試啦
public class Main { public static void main(String[] args) { //加載配置類 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); //從容器中獲取Cat類 Cat cat = context.getBean(Cat.class); cat.eat();//調用Cat類的方法 } }
結果:
1 現在我們把我這條魚,清洗一下 2 小白貓,開始吃魚了!!!! 3 收拾,小白貓吃剩下來的殘渣。!!!
只要我們把切面類里面的@Componet去掉,就會發現,這只貓,是直接吃魚的。

這就是面向切面編程。。。。
