目录
它是通过拦截目标方法的方式 ,在目标方法前后增强功能的通知.它是功能最强大的通知,一般事务使用此通知.它可以轻易的改变目标方法的返回值。



环绕通知
- @Aspect
- @Component
- public class MyAspect {
- /**
- * 环绕通知方法的规范
- * 1)访问权限是public
- * 2)切面方法有返回值,此返回值就是目标方法的返回值
- * 3)方法名称自定义
- * 4)方法有参数,此参数就是目标方法
- * 5)回避异常Throwable
- * 6)使用@Around注解声明是环绕通知
- * 参数:
- * value:指定切入点表达式
- */
-
- @Around(value = "execution(* com.bjpowernode.s03.*.*(..))")
- public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
- //前切功能实现
- System.out.println("环绕通知中的前置功能实现............");
- //目标方法调用
- Object obj = pjp.proceed(pjp.getArgs());
- //后切功能实现
- System.out.println("环绕通知中的后置功能实现............");
- return obj.toString().toUpperCase(); //改变了目标方法的返回值
- }
- }
无论目标方法是否正常执行,最终通知的代码都会被执行。




给切入点表达式起别名@Pointcut
如果多个切面切入到同一个切入点,可以使用别名简化开发。
使用@Pointcut注解,创建一个空方法,此方法的名称就是别名。

- @Aspect
- @Component
- public class MyAspect {
- /**
- * 最终通知方法的规范
- * 1)访问权限是public
- * 2)方法没有返回值
- * 3)方法名称自定义
- * 4)方法没有参数,如果有也只能是JoinPoint
- * 5)使用@After注解表明是最终通知
- * 参数:
- * value:指定切入点表达式
- */
- @After(value = "mycut()")
- public void myAfter(){
- System.out.println("最终通知的功能........");
- }
-
- @Before(value = "mycut()")
- public void myBefore(){
- System.out.println("前置通知的功能........");
- }
-
- @AfterReturning(value = "mycut()",returning = "obj")
- public void myAfterReturning(Object obj){
- System.out.println("后置通知的功能........");
- }
- @Around(value = "mycut()")
- public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
- System.out.println("环绕通知中的前置通知的功能........");
- Object obj = pjp.proceed(pjp.getArgs());
- System.out.println("环绕通知中的后置通知的功能........");
- return obj;
- }
-
- @Pointcut(value = "execution(* com.bjpowernode.s04.*.*(..))")
- public void mycut(){}
- }
测试

(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象
(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
