当前位置:   article > 正文

Spring Aop--通知注解_aop通知注解

aop通知注解

一、环绕注解

环绕注解

环绕注解@Aroud

注解描述
@Around@Around是Spring AOP中的一种通知类型,用于在目标方法执行前后进行环绕操作。它可以在方法调用前后增加额外的逻辑,例如日志记录、性能监控等。@Around注解需要配合AspectJ表达式来指定切入点,定义切面类的方法,并在方法内部通过ProceedingJoinPoint参数来控制目标方法的执行流程。

环绕注解,通过环绕注解可以实现对增强的整合。

对于环绕注解需要创建ProceedingJoinPoint对象并需要使用连两个对应方法

方法描述
proceed()执行被通知的目标方法,并返回其返回值。在环绕通知中必须调用此方法,否则目标方法不会执行。
getArgs()获取目标方法的参数值数组。返回的参数数组是Object类型的。

环绕注解使用案例:

  1. @Component
  2. @Aspect
  3. public class RoundAdvice {
  4. @Around("com.alphamilk.Advice.MyPointcut.pointcut1()")
  5. public Object Transation(ProceedingJoinPoint joinPoint){
  6. // 获取方法参数
  7. Object[] args = joinPoint.getArgs();
  8. // 获取返回值
  9. Object result = null;
  10. try {
  11. System.out.println("事务开始");
  12. // 执行对应方法
  13. result = joinPoint.proceed(args);
  14. System.out.println("事务结束");
  15. } catch (Throwable e) {
  16. System.out.println("事务回滚");
  17. throw new RuntimeException(e);
  18. }
  19. return result;
  20. }
  21. }

 注意:使用增强需要开启通知注解

  1. @ComponentScan(value = "com.alphamilk")
  2. @Configuration
  3. //开启增强注解
  4. @EnableAspectJAutoProxy
  5. public class JavaConfig {
  6. }

 而如果不是使用环绕注解,则需要使用@Before @After @AfterReturning等

  1. @Component
  2. @Aspect
  3. public class advice {
  4. @Before("com.alphamilk.Advice.MyPointcut.pointcut1()")
  5. public void Before(JoinPoint joinPoint) {
  6. System.out.println("事务开始");
  7. }
  8. @After("com.alphamilk.Advice.MyPointcut.pointcut1()")
  9. public void After(JoinPoint joinPoint) {
  10. System.out.println("事务结束");
  11. }
  12. @AfterReturning(value = "com.alphamilk.Advice.MyPointcut.pointcut1()",returning = "result")
  13. public void AfterReturning(JoinPoint joinPoint,Object result) {
  14. System.out.println("调用拥有返回值的方法");
  15. }
  16. @AfterThrowing(value = "com.alphamilk.Advice.MyPointcut.pointcut1()",throwing = "throwable")
  17. public void AfterThrowing(JoinPoint joinPoint,Throwable throwable) {
  18. System.out.println("调用有异常的方法");
  19. }
  20. }

使用环绕注解的优缺点

优点:

  1. 灵活性高:环绕注解提供了最大程度的灵活性,可以在目标方法执行前后插入额外的逻辑代码,对方法的执行过程进行全面控制。
  2. 统一处理:通过环绕注解,可以将通用的逻辑代码抽取到切面中,实现统一的处理逻辑,避免在各个目标方法中重复编写相同的代码。
  3. 可以修改返回值:在环绕通知中,可以通过修改目标方法的返回值来影响最终的结果。

缺点:

  1. 复杂性增加:相对于其他类型的通知,环绕注解的使用稍显复杂,需要更多的理解和掌握,特别是对于ProceedingJoinPoint的使用。
  2. 性能开销:由于环绕注解会包裹整个目标方法的执行流程,在某些情况下可能会带来一定的性能开销,特别是处理逻辑较为复杂的情况。
  3. 可能引入副作用:在环绕通知中对目标方法做任意修改时,需要谨慎操作,避免引入不可预料的副作用,导致程序出现异常或不正常的行为。

 二、优先级注解

注解描述
@Order@Order是Spring框架中用于定义组件的加载顺序的注解。它可以用在类级别或方法级别上。当多个组件都实现了同一个接口或继承了同一个父类时,通过@Order注解可以指定它们的加载顺序。@Order的值越小,优先级越高,具有更高的加载顺序。@Order注解的值可以是任意整数。需要注意的是,相同优先级的组件加载顺序是不确定的,所以最好将优先级设置为不同的值来避免不确定性。

如果对于同一个方法有两种甚至多种增强,并且需要指定增强的循序,则需要使用@Order优先级注解来设置。

对于其使用,核心在于:指定一个优先级,Order的值越低越是优先,越高优先级前置先执行,后置后执行

案例代码:(第一个增强)

  1. @Component
  2. @Aspect
  3. //设置一个优先级更高注解
  4. @Order(10)
  5. public class advice {
  6. @Before("com.alphamilk.Advice.MyPointcut.pointcut1()")
  7. public void Before(JoinPoint joinPoint) {
  8. System.out.println("优先级高前置执行");
  9. }
  10. @After("com.alphamilk.Advice.MyPointcut.pointcut1()")
  11. public void After(JoinPoint joinPoint) {
  12. System.out.println("优先级高后置后执行");
  13. }
  14. @AfterReturning(value = "com.alphamilk.Advice.MyPointcut.pointcut1()",returning = "result")
  15. public void AfterReturning(JoinPoint joinPoint,Object result) {
  16. System.out.println("调用拥有返回值的方法");
  17. }
  18. @AfterThrowing(value = "com.alphamilk.Advice.MyPointcut.pointcut1()",throwing = "throwable")
  19. public void AfterThrowing(JoinPoint joinPoint,Throwable throwable) {
  20. System.out.println("调用有异常的方法");
  21. }
  22. }

第二个增强

  1. @Component
  2. @Aspect
  3. @Order(20)
  4. public class RoundAdvice {
  5. @Around("com.alphamilk.Advice.MyPointcut.pointcut1()")
  6. public Object Transation(ProceedingJoinPoint joinPoint){
  7. Object[] args = joinPoint.getArgs();
  8. Object result = null;
  9. try {
  10. System.out.println("优先级低前置后执行");
  11. // 执行对应方法
  12. result = joinPoint.proceed(args);
  13. System.out.println("优先级低后置先执行");
  14. } catch (Throwable e) {
  15. System.out.println("事务回滚");
  16. throw new RuntimeException(e);
  17. }
  18. return result;
  19. }
  20. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/911026
推荐阅读
相关标签
  

闽ICP备14008679号