zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    关闭窗体后,利用StreamWriter保存控件里面的数据
    ref传递
    C# 特性 Attribute
    关键字 new 的作用
    关键字 base 的作用
    关键字 this 的作用
    random类的使用
    数据库结果为 基于左右值排序的无限分类算法
    PHP显示日期、周几、农历初几、什么节日函数编程代码
    描述了say_hello函数的具体内容,调用zend_printf系统函数在php中打印字符串
  • 原文地址:https://www.cnblogs.com/xiaosiyuan/p/6484005.html
Copyright © 2011-2022 走看看