首页 > 其他分享 >Spring 高级 切点匹配

Spring 高级 切点匹配

时间:2022-10-03 14:44:08浏览次数:62  
标签:匹配 matches Spring Transactional 切点 T1 public foo class

一、execution 和 annotation 两种方式设置切点匹配

package com.mangoubiubiu.show.a16;

import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.transaction.annotation.Transactional;

public class A16 {
    public static void main(String[] args) throws NoSuchMethodException {
        //根据切点表达式判断目标方法是否需要增强
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();

        //设置切点
        pointcut.setExpression("execution(* bar())");

        System.out.println(pointcut.matches(T1.class.getMethod("foo"), T1.class));
        System.out.println(pointcut.matches(T1.class.getMethod("bar"), T1.class));


        AspectJExpressionPointcut pointcut2 = new AspectJExpressionPointcut();

        //利用注解标注
        pointcut2.setExpression("@annotation(org.springframework.transaction.annotation.Transactional)");

        System.out.println(pointcut2.matches(T1.class.getMethod("foo"), T1.class));
        System.out.println(pointcut2.matches(T1.class.getMethod("bar"), T1.class));


    }



    static class T1 {
        @Transactional
        public void foo() {
        }
        public void bar() {
        }
    }

    @Transactional
    static class T2 {
        public void foo() {
        }
    }

    @Transactional
    interface I3 {
        void foo();
    }
    static class T3 implements I3 {
        public void foo() {
        }
    }
}

 

二、Transactional

Transactional 注解可以标注在类上,方法上,接口上 annotation只能匹配方法上加没有加注解。

Transactional 的作用域可以作用在 方法上 类上 接口上 如果一个类继承了 含有Transactional 的接口 那么它也生效。

package com.mangoubiubiu.show.a16;

import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.Method;

public class A16 {
    public static void main(String[] args) throws NoSuchMethodException {
        //根据切点表达式判断目标方法是否需要增强
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();

        //设置切点
        pointcut.setExpression("execution(* bar())");

//        System.out.println(pointcut.matches(T1.class.getMethod("foo"), T1.class));
//        System.out.println(pointcut.matches(T1.class.getMethod("bar"), T1.class));


        AspectJExpressionPointcut pointcut2 = new AspectJExpressionPointcut();

        //利用注解标注
        pointcut2.setExpression("@annotation(org.springframework.transaction.annotation.Transactional)");

//        System.out.println(pointcut2.matches(T1.class.getMethod("foo"), T1.class));
//        System.out.println(pointcut2.matches(T1.class.getMethod("bar"), T1.class));


        StaticMethodMatcherPointcut pt = new StaticMethodMatcherPointcut() {
            @Override
            public boolean matches(Method method, Class<?> targetClass) {

                //检查方法上是否加了 Transactional 注解
                MergedAnnotations mergedAnnotations = MergedAnnotations.from(method);
                if(mergedAnnotations.isPresent(Transactional.class)){
                    return true;
                }
                //检查类上是否加了 Transactional 注解 查找范围是本类
               // mergedAnnotations = MergedAnnotations.from(targetClass);
                //检查类上是否加了 Transactional 注解 查找范围是继承树 不仅搜索本类还会搜索父类,接口也会查一遍
                mergedAnnotations = MergedAnnotations.from(targetClass, MergedAnnotations.SearchStrategy.TYPE_HIERARCHY);

                if(mergedAnnotations.isPresent(Transactional.class)){
                    return true;
                }


                return false;
            }
        };

        //查看方法上是否标注了Transactional
        System.out.println(pt.matches(T1.class.getMethod("bar"), T1.class));
        System.out.println(pt.matches(T1.class.getMethod("foo"), T1.class));


        //查看类上是否标注了Transactional
        System.out.println(pt.matches(T2.class.getMethod("foo"), T2.class));



        //查看类继承的接口上是否标注了Transactional
        System.out.println(pt.matches(T3.class.getMethod("foo"), T3.class));
    }



    static class T1 {
        @Transactional
        public void foo() {
        }
        public void bar() {
        }
    }

    @Transactional
    static class T2 {
        public void foo() {
        }
    }

    @Transactional
    interface I3 {
        void foo();
    }
    static class T3 implements I3 {
        public void foo() {
        }
    }
}

 

 

 

标签:匹配,matches,Spring,Transactional,切点,T1,public,foo,class
From: https://www.cnblogs.com/mangoubiubiu/p/16750516.html

相关文章

  • Spring Tool 4 安装 Thymeleaf 3.0 插件
    目录参考资料说在前面最小要求步骤1.下载SpringTool4.7.12.下载thymeleaf的eclipse插件2.打开STS-Help-InstallNewSoftware...3.点击【Add...】-【Archive........
  • springboot常见错误
    错误1:运行项目后报如下错误解决方案报错2:​​Failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile(default-compile)onprojectsb​......
  • gradle安装、配置,使用命令构建spring boot项目
    安装#下载到本地直接解压#配置环境变量GRADLE_HOMEGRADLE_USER_HOMEPATH#打开cmd:gradle-videa配置打包常用命令#cmd进入项目根路径gradlewbuildgradlewcleangradleb......
  • Redis入门(四):springboot整合redis
    案例一​​demo​​​为​​chnx/springboot/redis01​​创建springboot项目,导入redis依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>s......
  • 【持久层框架】- SpringData - JPA
    SpringData-JPA......
  • Spring自学日志01-IOC(控制翻转)
    目录一、IOC的基本概念和底层原理1.1、什么是IOC?1.1.1、SpringIOC容器1.2、IOC底层原理1.2.1、IOC容器1.2.2、IOC容器装配Bean的方式1.2.3、IOC容器装配Bean的操作1.2.3.......
  • SpringSecurity异常处理器
    原理在SpringSecurity中,在认证或者授权的过程中出现的异常会被ExceptionTranslationFilter捕获到,在ExceptionTranslationFilter中会去判断这异常是认证失败还是授权失败产......
  • 第一季:10简单的谈一下SpringMVC的工作流程【Java面试题】
    第一季:10简单的谈一下SpringMVC的工作流程【Java面试题】​​前言​​​​推荐​​​​第一季:10简单的谈一下SpringMVC的工作流程​​​​题目​​​​分析​​​​最后​​......
  • Spring基础(十四):Spring的事务回顾
    文章目录​​Spring的事务回顾​​​​一、事务的概念​​​​二、事务的特性​​​​1、原子性​​​​2、一致性​​​​3、隔离性​​​​4、持久性​​​​三、事务的并......
  • Spring Lombok 实体类死循环问题
    在SpringJPA1对多查询的时候出现死循环的问题。如下图所示:  所有的配置都是正确的的,就是没有办法获得数据,并且出现死循环问题和解决因为使用lombak的 @Data......