美文网首页我的微服务框架建设收集spring boot
Springboot 开发常用技术整合--笔记14-使用AOP处

Springboot 开发常用技术整合--笔记14-使用AOP处

作者: 牵手生活 | 来源:发表于2019-08-08 12:11 被阅读158次

    切面的场景

    image.png image.png

    切面表达式-expression表达式等公式

    image.png

    designators:指示器主要是描述通过什么样的方式去匹配java类的哪些方法
    wildcards:通配符(*、+、。。),其中+表示匹配指定类及其之类,。。一般用于匹配任意数的自爆或任意参数的方法
    operators:运算符,比如要控制某个方法既满足条件A,又满足条件B


    image.png image.png

    advice注解

    advice5种注解

    pom添加依赖


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

    方式1@Before拦截某个controller的指定方法

    
    @Aspect
    @Component
    public class HttpAspect {
        //..表示任何参数都会被拦截
        //controller类.方法(参数).
        @Before("execution(public * com.younghare.wechatTask.controller.HelloWorldController.helloWorld(..))")
        public void log(){
            System.out.println("拦截到了HelloWorldController的helloWorld返回");
    
        }
    }
    
    image.png image.png

    方式2 使用@Pointcut注解要切面的点,然后结合@Before

    
    @Aspect
    @Component
    public class HttpAspect {
        //方式1
        //..表示任何参数都会被拦截
        //controller类.方法(参数).
        //方式2 定义@Pointcut需要切面的点
        @Pointcut("execution(public * com.younghare.wechatTask.controller.HelloWorldController.*(..))")
        public void log2(){
        }
        @Before("log2()")
        public void doBefore(){
            System.out.println("拦截到了HelloWorldController的方法aaaaa");
        }
    
        @After("log2()")
        public void doAfter(){
            System.out.println("拦截到了HelloWorldController的方法bbb");
        }
    
    }
    
    image.png
    image.png

    拦截方式3@Around,同时拦截参数

    @Aspect
    @Component
    public class HttpAspect {
    
        Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    
        //方式1
        //..表示任何参数都会被拦截
        //controller类.方法(参数).
        //@Before("execution(public * com.younghare.wechatTask.controller.HelloWorldController.helloWorld(..))")
        //拦截所有方法
        @Before("execution(public * com.younghare.wechatTask.controller.HelloWorldController.*(..))")
        public void log(){
            System.out.println("拦截到了HelloWorldController的helloWorld返回");
    
        }
    
        //方式2 定义@Pointcut需要切面的点
        @Pointcut("execution(public * com.younghare.wechatTask.controller.HelloWorldController.*(..))")
        public void log2(){
        }
        @Before("log2()")
        public void doBefore(){
            System.out.println("拦截到了HelloWorldController的方法aaaaa");
    
        }
    
        @After("log2()")
        public void doAfter(){
            System.out.println("拦截到了HelloWorldController的方法bbb");
        }
    
        //方式3 @Around注解用于修饰Around增强处理,Around增强处理是功能比较强大的增强处理,它近似于Before增强处理和AfterReturing增强处理的总结,Around增强处理既可在执行目标方法之前增强动作,也可在执行目标方法之后织入增强的执行。与Before增强处理、AfterReturning增强处理不同的是,Around增强处理可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标方法的执行。
    //@advice也包括了throws
    
    
        @Around( value ="execution(public * com.younghare.wechatTask.controller.HelloWorldController.*(..))")
        public void log3(ProceedingJoinPoint joinPoint){
            System.out.println("拦截到了HelloWorldController的拦截参数的==");
            //1.这里获取到所有的参数值的数组
            Object[] args = joinPoint.getArgs();
            Signature signature = joinPoint.getSignature();
            MethodSignature methodSignature = (MethodSignature) signature;
            //2.最关键的一步:通过这获取到方法的所有参数名称的字符串数组
            String[] parameterNames = methodSignature.getParameterNames();
            logger.info("args={}====signature={}==parameterNames={}",args,signature,parameterNames);
    
    
        }
    
    
    }
    
    image.png

    拦截方式4@Before,同时拦截参数

        //方式4
        //..表示任何参数都会被拦截
    
        //拦截所有方法
        @Before("execution(public * com.younghare.wechatTask.controller.HelloWorldController.*(..))")
        public void log4(JoinPoint joinPoint){
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
    
            //拦截url
            //拦截method方法
            //拦截ip
            logger.info("url={},method={},ip={}",request.getRequestURL(),request.getMethod(),request.getRemoteAddr());
    
            //拦截类名
            logger.info("class_name={},method={}",joinPoint.getSignature().getDeclaringTypeName()
                    ,joinPoint.getSignature().getName()
            );
    
            //拦截参数
            logger.info("args={}",joinPoint.getArgs());
    
        }
    
    image.png

    拦截方式5@AfterReturning,拦截返回值

    //方式5 拦截返回内容
    @AfterReturning(returning = "object",pointcut = "log2()")
    public void log5(Object object ){
    
        //拦截参数
        logger.info("return object={}", JSONObject.toJSONString(object) );
    
    }
    
    image.png

    拦截抛出异常的方法


    image.png

    参考资料

    详解Spring AOP 中 @Aspect 的高级用法
    Spring AOP获取拦截方法的参数名称跟参数值
    在SpringAOP中如何获取方法的参数值(实体类)以及参数名
    Spring AOP(五)之Around增强处理
    Spring AOP实现对商品增删改的日志记录

    更多查看AspectJ语法

    相关文章

      网友评论

        本文标题:Springboot 开发常用技术整合--笔记14-使用AOP处

        本文链接:https://www.haomeiwen.com/subject/noztjctx.html