zoukankan      html  css  js  c++  java
  • spring 系列 7-基于注解的aop

    使用@Component("logger")替换xml中的<bean id="logger" class="com.mantishell.utils.Logger"></bean>
    使用@Aspect替换<aop:config>标签
    使用@Pointcut替换<aop:pointcut>标签
    使用@Before替换<aop:before>
    使用@AfterReturning替换aop:after-returning>
    使用@AfterThrowing替换<aop:after-throwing>
    使用@After替换<aop:after>
    使用@Around替换<aop:around>

    package com.mantishell.utils;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    @Component("logger")
    @Aspect //表示当前类是一个切面类
    public class Logger {
        @Pointcut("execution(* com.mantishell.service.impl.*.*(..))")
        private void pt1(){}
        /**
         * 前置通知
         */
        //@Before("pt1()")
        public  void beforePrintLog(){
            System.out.println("前置通知Logger类中的beforePrintLog方法开始记录日志了。。。");
        }
    
        /**
         * 后置通知
         */
        //@AfterReturning("pt1()")
        public  void afterReturningPrintLog(){
            System.out.println("后置通知Logger类中的afterReturningPrintLog方法开始记录日志了。。。");
        }
        /**
         * 异常通知
         */
        //@AfterThrowing("pt1()")
        public  void afterThrowingPrintLog(){
            System.out.println("异常通知Logger类中的afterThrowingPrintLog方法开始记录日志了。。。");
        }
    
        /**
         * 最终通知
         */
        //@After("pt1()")
        public  void afterPrintLog(){
            System.out.println("最终通知Logger类中的afterPrintLog方法开始记录日志了。。。");
        }
    
        @Around("pt1()")
        public Object aroundPringLog(ProceedingJoinPoint pjp){
            Object rtValue = null;
            try{
                Object[] args = pjp.getArgs();//得到方法执行所需的参数
    
                System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。前置");
    
                rtValue = pjp.proceed(args);//明确调用业务层方法(切入点方法)
    
                System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。后置");
    
                return rtValue;
            }catch (Throwable t){
                System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。异常");
                throw new RuntimeException(t);
            }finally {
                System.out.println("Logger类中的aroundPringLog方法开始记录日志了。。。最终");
            }
        }
    }
    
    

    使用环绕通知的话,执行的顺序可控:
    Logger类中的aroundPringLog方法开始记录日志了。。。前置
    Logger类中的aroundPringLog方法开始记录日志了。。。后置
    Logger类中的aroundPringLog方法开始记录日志了。。。最终

    使用前置后置注解的话,执行顺序不被控制:
    前置通知Logger类中的beforePrintLog方法开始记录日志了。。。
    最终通知Logger类中的afterPrintLog方法开始记录日志了。。。
    后置通知Logger类中的afterReturningPrintLog方法开始记录日志了。。。

    所以最好还是使用环绕通知。

  • 相关阅读:
    yum 在线安装LAMP
    python-scrapy-增量式
    python-scrapy-分布式爬取
    python-scrapy-全站数据爬取-CrawlSpider
    python-scrapy-中间件的学习
    python-scrapy深度爬取
    python-scrapy环境配置
    django DOM
    window10设置环境变量(以设置虚拟环境和SQL为例)
    加入园子啦
  • 原文地址:https://www.cnblogs.com/mantishell/p/12670214.html
Copyright © 2011-2022 走看看