spring aop 二

October 31, 2020 · J2EE · 845次阅读

切入点表达式

  • 作用 用来匹配切入的方法。
  • execution(切入点表达式 方法返回值 )
  • execution([方法修饰符] 方法返回类型 全类名.方法名(参数类型))

    • 通配符 *

      • 匹配方法返回值
      • 匹配方法的包名
      • 匹配方法的类名
      • 匹配方法的方法名
      • 匹配方法的参数类型
    • 通配符 .. 任意 多个

      • 匹配任意层级的包
      • 匹配任意个数 任意类型的参数

    • 例子

      • 匹配任意层级的TargetObject对象

        <aop:beforemethod="printOne"pointcut="execution(
        public void ..TargetObject.print2())"/>
      • 匹配任意个数 任意类型的参数

        <aop:beforemethod="printOne"pointcut="execution(
        public void    org.example.TargetObject.print2(..))"/>
      • 匹配以Object结尾的对象 2结尾 任意参数类型 的方法

        <aop:beforemethod="printOne"pointcut="execution(
        public void    org.example.*Object.*2(..))"/>
  • 切入点配置方式

    • 局部切入点
    • 切面间共享切入点

      • 将切入点表达式写在切面配置外面
      • 例子:

         <aop:config>
                <aop:pointcut id="abc" expression="execution(
        public void org.example.TargetObject.print2())"/>
                <aop:aspect ref="advice">
                    <aop:before method="printOne" pointcut-ref="abc"/>
                </aop:aspect>
            </aop:config>
    • 切面内共享切入点

      • 将切入点配置在切面里 切入点外
      • 例子:

         <aop:config>
                <aop:aspect ref="advice">
                    <aop:pointcut id="abc" expression="execution(
        public void org.example.TargetObject.print2())"/>
                    <aop:before method="printOne" pointcut-ref="abc"/>
                </aop:aspect>
            </aop:config>
  • 切面执行顺序

    • 同一切面

      • 先配置先执行
    • 不同切面

      • 前置 前配置先执行
      • 后置 先配置后执行 后配置先执行
  • 通知获取 切入点参数

    • 通过 JoinPoint 对象获取

      public void printOne(JoinPoint jp) {
        Object[] args = jp.getArgs();
        for (int i = 0; i < args.length; i++) {
            Object arg = args[i];
        }
      
         }
    • 通过切入点指定参数类型 参数形参

        //切入点配置
        <aop:before method="printOne" pointcut="execution(
                     * org.example.TargetObject.print2(String)) &amp;&amp; args(a)"/>
        
        
        //通知
         public void printOne(String a) {
            System.out.println("我是参数" + a);
            System.out.println("我是通知");
        }
  • 注解配置

    • 执行优先级

      • 环绕在前 前置后置 在后 返回最后

none

最后编辑于10个月前

添加新评论