縱觀AOP編程,其中需要程序員參與的只有3個部分:
- 定義普通業務組件
- 定義切入點:一個切入點可能橫切多個業務組件
- 定義增強處理:增強處理就是在AOP框架爲普通業務組件織入的處理動作
代理對象的方法 = 被代理對象的方法 + 增強處理
下面記錄一下,Spring中的AOP配置
<?xml version="1.0" encoding="UTF-8"?> <beans ...... xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="...... http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 啓動@AspectJ支持 --> <aop:aspectj-autoproxy/> <!-- 如果不打算用Spring的XML Schema配置方式,則應該在Spring配置文件中增加如下片段來啓用@AspectJ支持 --> <!--<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>--> </beans>
爲了在Spring應用中啓動@AspectJ支持,還需要在應用的類路徑中增加兩個AspectJ庫:aspectjweaver.jar和aspectjrt.jar,字節使用AspectJ安裝路徑的lib目錄下的兩個JAR文件即可。
1、定義切面Bean
使用@AspectJ標註一個Java類,該Java類將會作爲切面Bean
2、定義Before增強處理
package com.zhao.aopdemo;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class BeforeAdviceTest {
@Before("execution(* com.zhao.aopdemo.*.say*(..))")
public void beforeSay()
{
System.out.println("Before say...");
}
}
// Before註解
@Before("execution(* com.zhao.aopdemo.*.say*(..))")
解釋:com.zhao.aopdemo包下面所有類中的以say開頭的方法
3、定義AfterReturning增強處理
package com.zhao.aopdemo;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AfterReturningAdviceTest {
@AfterReturning(returning = "word", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
public void afterReturningSay(Object word) {
System.out.println("After Returning say..." + word);
}
}
使用@AfterReturning 的時候,指定了一個returning的屬性,該屬性值爲word,這表明允許在增強處理方法afterReturningSay中使用名爲word的形參,該形參代表目標發那個發的返回值。
4、AfterThrowing增強處理
package com.zhao.aopdemo;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AfterThrowingTest {
@AfterThrowing(throwing = "ex", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
public void afterThrowingSay(Throwable ex) {
System.out.println("目標類拋出的異常:" + ex);
}
}
輸出:
Before say...
目標類拋出的異常:java.lang.ArithmeticException: / by zero
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.zhao.aopdemo.Chinese.sayThrowable(Chinese.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
......
主程序依然結束了
這裏afterThrowingSay方法的形參類型如果換成NullPointerException異常,該切入點就只匹配NullPointerException異常
5、After增強處理
Spring還提供了一個After增強處理,它與AfterReturning增強處理有點相似,但是也有區別
- AfterReturning增強處理只有在目標方法成功完成後纔會被織入
- After增強處理不管目標方法如何結束(包括成功完成和遇到異常終止兩種情況),它都會被織入
6、Around增強處理
未完待續...