spring-AOP-基于@AspectJ切面的小例子

条件:

1.jdk的版本在5.0或者以上,否则无法使用注解技术

2.jar包:

  aspectjweaver-1.7.4.jar

  aspectjrt-1.7.4.jar

  spring-framework-bom-4.0.5.RELEASE-sources.jar

开始编写一个简单的基于@AspectJ的切面

//代理对象
public class testweaver {
    public void hello(){
        System.out.println("hello,world");
    }
}
@Aspect //通过注解的方式标示为切面
public class TestAnnotationAspect {//定义切点@Before和增强类型
    @Before("execution(* hello(..)))")
    public void doBefore(){
        System.out.println("前置通知");
    }
    //定义切点@After和增强类型
    @After("execution(* hello(..)))")
    public void doAfter(){
         System.out.println("最终通知"); 
    }
}
public class Test{
   public static void main(String[] args) {
              //创建对象
        AspectJProxyFactory a = new AspectJProxyFactory();
        testweaver t = new testweaver();
              //设置目标对象
        a.setTarget(t);
              //设置切面类
        a.addAspect(TestAnnotationAspect.class);
              //生成织入的代理对象
        testweaver t2 = a.getProxy();                                                  
        t2.hello();
    }
}

 整个流程:

在这个例子中, testweaver类和TestAnnotationAspect类都只是一个简单的类,而TestAnnotationAspect类标注了@AspectJ的注解,

这让在后续的第三方程序能检测的到拥有@Aspect的类是否是一个切面类。

其次,TestAnnotationAspect类中的doBefore() 标注了@Before,意思为前置增强。后面的execution() 使用切点函数的方法匹配模式串注明了成员值。

而成员值为一个@Aspectj切点表达式,意思为在目标类的hello()上织入增强,可以带入任意的入参和任意的返回值。

最后通过org.springframework.aop.aspectj.annotation.AspectJProxyFactory 为 testweaver类生成切面代理。

原文地址:https://www.cnblogs.com/tjc1996/p/5720411.html