纵观AOP编程,其中需要程序员参与的只有3个部分:
代理对象的方法 = 被代理对象的方法 + 增强处理
?
下面记录一下,Spring中的AOP配置
class="xml"><?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)
......
主程序依然结束了
这里monospace; font-size: 1em; line-height: 1.5; background-color: #fafafa;">afterThrowingSay方法的形参类型如果换成NullPointerException异常,该切入点就只匹配NullPointerException异常
?
5、After增强处理
Spring还提供了一个After增强处理,它与AfterReturning增强处理有点相似,但是也有区别
6、Around增强处理
未完待续...