上一篇是Aop的详解,接下来介绍一个Spring的注释封装:
1. 定义一个方法
public class Monkey {
public void stealPeaches(String name){
System.out.println("【猴子】"+name+"正在偷桃...");
}
}
2. 定义一个切面
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Guardian {
@Pointcut("execution(* test.org.springframework.aop.aspectj.ycl.Monkey.stealPeaches(..))")
public void foundMonkey(){
System.out.println("切点,这个方法随便命名.");
}
@Before(value="foundMonkey()")
public void foundBefore(){
System.out.println("前置通知");
System.out.println("【守护者】发现猴子正在进入果园...");
}
@AfterReturning("foundMonkey() && args(name,..)")
public void foundAfter(String name){
System.out.println("后置通知");
System.out.println("【守护者】抓住了猴子,守护者审问出了猴子的名字叫“"+name+"”...");
}
}
3.定义配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<!-- 定义Aspect -->
<bean id="guardian" class="test.org.springframework.aop.aspectj.ycl.Guardian" />
<!-- 定义Common -->
<bean id="monkey" class="test.org.springframework.aop.aspectj.ycl.Monkey" />
<!-- 启动AspectJ支持 -->
<aop:aspectj-autoproxy />
</beans>
4.编写测试用例
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Main a = new Main();
a.domy();
}public void domy() {
// TODO Auto-generated method stub
ApplicationContext context = new ClassPathXmlApplicationContext(
"beans.xml", this.getClass());
Monkey monkey = (Monkey) context.getBean("monkey");
try {
monkey.stealPeaches("孙大圣的大徒弟");
} catch (Exception e) {
}
/**
* 此AOP特点
* 1. 可以定义是否进行方法前进行拦截
* 2. 可以定义是否进行方法后进行拦截
* 3. 可以方便的定义方法执行前和执行后的代码
* 4. 在定义切点的时候,可以清楚的看到方法执行前和执行后.
* 缺点:
* 1. 无法设置主方法是否执行
* 2. 虽然可以设置方法过滤,但是方法之间的过滤关系必须
* 设置在注释里面。
* 优点:
* 方便,简洁.
* 适用于任意类集,不需要指定任何接口等,使用cglib会自动生成
*/
}
}
总结,使用Aspectj全封装Spring使用Aop的全部细节,我这里只定义了两个类,然后配置文件也是清晰自然,唯一的关系在那个切面类里面进行定义.