AOP注解开发通知执行顺序控制

Spring AOP配置之注解方式

使用注解配置AOP的实现步骤

  1. 在pom.xml文件中导入所需的依赖
  2. 在配置文件中开启AOP注解支持
  3. 配置切面类@Aspect
  4. 配置切入点@pointcut
  5. 配置通知方法,并为通知方法配置通知类型@Before…

使用注解

  1. @Aspect

    • 作用位置:作用于类上。

    • 作用:设定当前类为切面类。

    • 格式

      @Aspect
      public class AopAdvice {
      }
      
  2. @Pointcut

    • 作用位置:作用于方法上

    • 作用:使用当前方法的方法名,作为切入点的引用名称。

    • 格式

      @Pointcut("execution(* *(..))")
      public void pt() {
      }
      
    • 说明

      被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)

  3. @Before

    • 作用位置:作用于方法上

    • 作用:标记当前方法作为前置通知

    • 格式

      在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。

      @Before("pt()")
      public void before(){
      }
      
  4. @AfterReturning

    • 作用位置:作用于方法上

    • 作用:标记当前方法作为后置通知

    • 格式

      在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。

      @AfterReturning(value="pt()",returning = "ret")
      public void afterReturning(Object ret) {
      }
      
    • 特殊参数

      returning:设定使用通知方法参数接收返回值的变量名。

  5. @AfterThrowing

    • 作用位置:作用于方法上

    • 作用:标记当前方法作为异常通知

    • 格式

      在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。

      @AfterThrowing(value="pt()",throwing = "t")
      public void afterThrowing(Throwable t){
      }
      
    • 特殊参数

      throwing :设定使用通知方法参数接收原始方法中抛出的异常对象名

  6. @After

    • 作用位置:作用于方法上

    • 作用:标记当前方法作为最终通知

    • 格式

      在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。

      @After("pt()")
      public void after(){
      }
      
  7. @Around

    • 作用位置:作用于方法上

    • 作用:标记当前方法作为环绕通知

    • 格式

      在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。

      @Around("pt()")
      public Object around(ProceedingJoinPoint pjp) throws Throwable {
          //执行原始方法
          Object ret = pjp.proceed();
          return ret;
      }
      

配置AOP实例

  • 普通类

    @Component
    public class Demo {
    
        public void test1() {
            System.out.println("测试方法1!");
        }
    
        public void test2() {
            System.out.println("测试方法2!");
        }
    }
    
  • 切面类

    /**
     * @Aspect 注明此类是一个切面类
     */
    @Aspect
    @Component
    public class Aop {
    
        /**
         * 配置切入点
         */
        @Pointcut("execution(* com.itheima..*.*(..))")
        public void pt() {
        }
    
    
        /**
         * 配置前置通知
         */
        @Before("pt()")
        public void before() {
            System.out.println("前置通知......");
        }
    
    }
    
  • xml配置

    要将普通类和切面类都配入spring容器,所以要开启组件扫描和aop注解支持

    <!--配置组件扫描器-->
    <context:component-scan base-package="com.itheima"/>
    
    <!--开启AOP注解驱动支持-->
    <aop:aspectj-autoproxy />
    
  • 或者使用注解方式(去掉xml配置文件)

    //表明此类是spring的配置类
    @Configuration
    
    //主键扫描
    @ComponentScan("com.itheima")
    
    //启用aop注解驱动
    @EnableAspectJAutoProxy
    public class SpringConfig {
        
    }
    
  • 测试

    @RunWith(SpringJUnit4ClassRunner.class)
    //加载上下文配置
    @ContextConfiguration(classes = SpringConfig.class)
    public class Test2 {
    
        @Autowired
        private Demo demo;
    
        @Test
        public void AopTest() {
            demo.test1();
        }
    }
    
  1. AOP使用XML配置情况下,通知的执行顺序由配置顺序决定,在注解情况下由于不存在配置顺序的概念
    的概念,参照通知所配置的方法名字符串对应的编码值顺序,可以简单理解为字母排序
    • 同一个通知类中,相同通知类型以方法名排序为准
    • 不同通知类中,以类名排序为准
    • 使用@Order注解通过变更bean的加载顺序改变通知的加载顺序
  2. 企业开发经验
    • 通知方法名由3部分组成,分别是前缀、顺序编码、功能描述
    • 前缀为固定字符串,例如baidu、itheima等,无实际意义
    • 功能描述为该方法对应的实际通知功能,例如exception、strLenCheck
    • 控制通知执行顺序使用顺序编码控制,使用时做一定空间预留
      • 003使用,006使用,预留001、002、004、005、007、008
      • 使用时从中段开始使用,方便后期做前置追加或后置追加
      • 最终顺序以运行顺序为准,以测试结果为准,不以设定规则为准
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值