• springboot 中使用AOP


    网上关于AOP的例子好多,各种名词解释也一大堆,反正名词各种晦涩,自己写个最最最简单的例子入门mark一下,以后再深入学习。

    maven依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    定义切面

    @Aspect
    @Configuration
    public class AopConfiguration {
    
    }

    切面内定义切入点,就是执行的条件

    @Pointcut("execution(* com.test.service.*.*(..))")
        public void executeService()
        {
    
        }

    切入点的方法不用任何代码,返回值是void,最重要的是执行的条件的表达式:

       1)execution:用于匹配子表达式。
    
                //匹配com.cjm.model包及其子包中所有类中的所有方法,返回类型任意,方法参数任意
                @Pointcut("execution(* com.cjm.model..*.*(..))")
                public void before(){}
    
     
    
          2)within:用于匹配连接点所在的Java类或者包。
    
                //匹配Person类中的所有方法
                @Pointcut("within(com.cjm.model.Person)")
                public void before(){}
    
     
    
                //匹配com.cjm包及其子包中所有类中的所有方法
    
                @Pointcut("within(com.cjm..*)")
                public void before(){}
    
     
    
         3) this:用于向通知方法中传入代理对象的引用。
                @Before("before() && this(proxy)")
                public void beforeAdvide(JoinPoint point, Object proxy){
                      //处理逻辑
                }
    
     
    
          4)target:用于向通知方法中传入目标对象的引用。
                @Before("before() && target(target)
                public void beforeAdvide(JoinPoint point, Object proxy){
                      //处理逻辑
                }
    
     
    
          5)args:用于将参数传入到通知方法中。
                @Before("before() && args(age,username)")
                public void beforeAdvide(JoinPoint point, int age, String username){
                      //处理逻辑
                }
     
          6)@within :用于匹配在类一级使用了参数确定的注解的类,其所有方法都将被匹配。 
    
                @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation标注的类都将匹配
                public void before(){}
    
      
    
          7)@target :和@within的功能类似,但必须要指定注解接口的保留策略为RUNTIME。
                @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
                public void before(){}
    
     
    
          8)@args :传入连接点的对象对应的Java类必须被@args指定的Annotation注解标注。
                @Before("@args(com.cjm.annotation.AdviceAnnotation)")
                public void beforeAdvide(JoinPoint point){
                      //处理逻辑
                }
    
      
    
          9)@annotation :匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。
                @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
                public void before(){}
    
          10)bean:通过受管Bean的名字来限定连接点所在的Bean。该关键词是Spring2.5新增的。
                @Pointcut("bean(person)")
                public void before(){}

    接下来定义通知,就是行为呗,常用的包括Before,Around,After等

     @Before("executeService() &&"+"args(name)")
        public void before(String name)
        {
            System.out.println("before say hello");
            System.out.println("name = "+name);
        }
    
        @AfterReturning("executeService()")
        public void after()
        {
            System.out.println("after return");
        }

    这样调用com.test.service包下所有类的方法前都先回执行@Before的行为,结束都会执行@AfterReturning的行为。

    更为详细的介绍参考:http://www.cnblogs.com/lic309/p/4079194.html

  • 相关阅读:
    STL
    Python
    Swift学习笔记
    Swift学习笔记
    Cocos2d-x -- 如何让背景从上到下滚动
    Cocos2d-x -- 图片菜单按钮
    How to change in the Cocos2d-x project from landscape to portrait both in iOS and Android
    系统集成项目管理工程师和信息系统管理工程师的区别是什么?
    公积金取出来后悔了 公积金取出来好还是不取好?
    青岛公积金贷款额度最高多少?怎么算?
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/6484005.html
Copyright © 2020-2023  润新知