Spring学习之AOP
1.AOP:面向切面编程。
在运行一个方法时,如果想在运行方法前后加入输出它的相关信息,如果直接将这些代码直接加进方法体中,会造成代码耦合,于是AOP应运而生,超级简洁。
2.第一步:导包,这一次无论使用eclipse还是idea都需要导包
第二步:为你创建的类(包括切面类)加必要的注释(如@Component),同时还需要在容器中注册;
第三步:为你创建的切面类加@Aspect告诉容器我是切面类,在切面类中写方法,在方法头前可加四种注释
@Before,在切向的方法执行前执行该方法。
@After,在切向的方法执行后执行该方法。
@AfterReturning,在切向的方法执行后返回值时执行该方法,执行在After之后。
@AfterThrowing,在切向的方法抛出异常时执行。
同时需要绑定你切向的方法,如下所示:
上述方法:在其他方法调用Claculator的div,会调用用该方法。
还能绑定多个切向方法,同样可以获得方法名和参数:
如果参数列表中是..可以匹配所有参数类型,*可以匹配一级文件目录;,,可以匹配多级。
如果想要方法的返回值,可以再@AfterReturn中获取,如下:
@AfterReturning(value = "execution(public int com.atguigu.bean.Calculator.div(..))",returning = "result")
public void afterReturn(JoinPoint joinPoint, Object result){
System.out.println("这里是返回值");
}
4.当用户想便于修改,抽取方法时,可如下形式抽取:
随便定义一个空方法,注解Pointcut,在原方法中引用即可。
是上面四种注解的合体,与上面注解使用大致相同,在@Around()中携带ProceedingJoinPoint参数,同样可以获取参数,它类似过滤器一样,“它拦截方法后,需要用proceedingJoinPoint.proceed(args)来放行去运算,运算出来的结果再通过返回给调用的方法”,在你拦截之前,之后,抛出异常时,返回值时都可以添加自己的元素。
@Around("execution(public int com.atguigu.bean.Calculator.*(int,int))")
public Object aroundTest(ProceedingJoinPoint proceedingJoinPoint) {
Object[] args = proceedingJoinPoint.getArgs();
System.out.println(Arrays.asList(args));
Object proceed = null;
try {
//@Before
proceed = proceedingJoinPoint.proceed(args);
//AfterReturing
} catch (Throwable throwable) {
//AfterThrowing
}finally {
//After
}
return proceed;
}
6.两个切面类同时切一个方法,按类名排序,同时可以注解order(n)指定排序,数越小优先级越大。
上一篇: Spring之AOP学习