zoukankan      html  css  js  c++  java
  • AOP切面操作

    package com.hxkr.util;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    /**
     * 
         AOP的一些相关概念
            切面(Aspect):是切入点和通知的结合;
            连接点(Joinpoint):类里面可以被增强的方法,这些方法称为连接点;
            增强处理(Advice):指拦截到Joinpoint之后所要做的事情就是通知.
                                通知分为前置通知(@Before),后置通知(@After),异常通知(@AfterThrowing),最终通知(@AfterReturning),环绕通知(切面要完成的功能)(@Around);
            切入点(Pointcut):指我们要对哪些Joinpoint进行拦截的定义
     *
     */
    @Aspect
    @Component
    public class LogInterceptor {
        /**
         * 使用方法:springboot为例
         *           第一步:引入AOP依赖
         *                 <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-aop</artifactId>
                        </dependency>
                第二步:使用@Aspect和@Component注解将一个java类定义为切面类
                第三步:使用@Pointcut定义一个切入点(定义在哪个方法里使用)
                第四步:根据需要在切入点不同位置的切入内容
                                   使用@Before在切入点开始处切入内容
                                   使用@After在切入点结尾处切入内容
                                   使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
                                   使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
                                   使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
         *                 
         */
    
        /* 定义一个切入点 */
        /**
         * AspectJ语法
            "execution(* cn.youyinian.controller.v1.*.*(..))"
            指定在执行 cn.youyinian.controller.v1 包中任意类的任意方法之前执行方法增强;
            第一个星号表示返回值不限;
            第二个星号表示类名不限;
            第三个星号表示方法名不限;
            圆括号中的 .. 表示任意个数、类型不限的形参。
         */
        @Pointcut("execution(* com.hxkr.service.*.*(..))")
        private void log() {
    
        }
    
        /**
         * 切入点之前的操作
         */
        @Before("log()")
        /**
         * 在切入点前的操作,按order的值由小到大执行
         * 在切入点后的操作,按order的值由大到小执行
         */
        @Order(2)
        private void before() {
            System.out.println("[定时任务]  >>>>>>>>>>>>>>>>>>> 开始");
        }
        
        @Before("log()")
        @Order(1)
        private void after() {
            System.out.println("[定时任务]  >>>>>>>>>>>>>>>>>>> 结束");
        }
    }
  • 相关阅读:
    python设计模式-单例模式
    bash脚本条件测试总结
    Python网络编程:IO多路复用
    Python面向对象高级编程:@property--把方法变为属性
    Sql Server存储过程基本语法
    接口幂等性
    [转载]使用消息队列实现分布式事务-公认较为理想的分布式事务解决方案
    C#分布式事务解决方案-TransactionScope
    SOA架构和微服务架构的区别
    Atlas实现数据库读写分离
  • 原文地址:https://www.cnblogs.com/chLxq/p/10820006.html
Copyright © 2011-2022 走看看