spring aop切面编程

applicationContext.xml里面一定要有        <aop:aspectj-autoproxy />

//定义好First类,这个类是要被插入代码的类(对象类) 
@Service

public class First {
    @Value("再次成功")
    public String hh;
    public void test(){
    System.out.println("test方法执行");
}

简单说一下execution()里面的写法:

其实里面就是一个方法的完整形式:返回类型+方法的位置+方法参数

比如:execution(* test1.First.test()) 。第一个*就是返回类型,*是任何类型,test1是包名,First是类名,test()是方法,当然没有参数,所以不写参数

//Two类为切面类,@Before()声明twotest()方法在 test1.First.test()方法之前执行,test1是包名,First是test1下的类,test()是方法
@Service
@Aspect
public class Two {
    @Before("execution(* test1.First.test())") //前置
    public void twotest(){
        System.out.println("执行test方法之前执行");
    }
    @After("execution(* test1.First.test())") //同理,后置
    public void twotest2(){
        System.out.println("执行test方法之后执行");
    }
}

后置还有一种,@AfterReturning,此注解效果和@After一样,但是还多了一个可选的参数,如果想要得到目标方法的返回值,操作如下:
@AfterReturning(value="execution(* test1.First.test())",  returning="aaa") //aaa是参数的名字,自己定义即可
public void twotest3(Object aaa){
    System.out.println("aaa");
}
如果不需要得到返回值,那么@AfterReturning用法和@After一样。

如何用一个注解就能在目标方法的前后都执行呢?
@Around("execution(* test1.First.test())")
public void twotest3(ProceedingJoinPoint pjp) throws Throwable{  //不能少了ProceedingJoinPoint参数
    System.out.println("执行test方法环绕"); //在test()方法之前执行
    pjp.proceed();
    System.out.println("执行"); //在test()方法之后执行
}

猜你喜欢

转载自blog.csdn.net/dgh112233/article/details/81233373