当前位置: 首页 > article >正文

Spring-AOP

基于注解的AOP

基本过程

  1. 导入AOP模块依赖 spring-aspects

  2. 定义一个业务逻辑类,在业务逻辑执行的时候进行日志打印

    /**
     * 数学工具类
     */
    public class MathCalculatorUtils {
    
        public int div(Integer m, Integer n){
            return m / n;
        }
    
    }
    
  3. 定义一个日志切面类

    @Aspect //切面类
    public class LogAspects {
    
        private Date start = null;
    
        //定义公共切入点表达式
        @Pointcut("execution(* cn.shaoxiongdu.utils.*.*(..))")
        public void pointCut(){}
    
        //通知方法 前置通知: 目标方法执行之前 执行
        @Before(value = "pointCut()")
        public void logStart(JoinPoint joinPoint){
            start = new Date();
            System.out.println("@before {"+joinPoint.getSignature().getName()+"} 执行开始,参数列表{"+ Arrays.toString(joinPoint.getArgs()) +"}");
    
        }
    
        //后置方法 目标方法执行完毕之后 执行(不论目标方法是否成功执行都执行)
        @After("pointCut()")
        public void logEnd(JoinPoint joinPoint){
            System.out.println("@After {"+joinPoint.getSignature().getName()+"}执行结束");
            System.out.println("执行时间: {" + (new Date().getTime() - start.getTime()) + "ms}");
    
        }
    
        //方法正常返回之后执行
        @AfterReturning( value = "pointCut()",returning = "result")
        public void logReturn(JoinPoint joinPoint,Object result){
            System.out.println("@AfterReturning {"+joinPoint.getSignature().getName()+"}正常返回!运行结果{"+result+"}");
    
        }
    
        //方法抛出异常 执行
        @AfterThrowing(value = "pointCut()",throwing = "exception")
        public void logException(JoinPoint joinPoint,Exception exception ){
            System.out.println("@AfterThrowing {"+joinPoint.getSignature().getName()+"}异常,!异常信息{"+exception+"}");
        }
    
    }
    
  4. 将切面类和目标类都加入到容器中

    @Configuration //这是一个配置类
    @EnableAspectJAutoProxy //开启Aspect的aop模式
    public class MainConfigAOP {
    
        @Bean
        public MathCalculatorUtils mathCalculatorUtils(){
            return new MathCalculatorUtils();
        }
    
        @Bean
        public LogAspects logAspects(){
            return new LogAspects();
        }
    
    }
    
  5. 测试

    public class TestMain {
    
        private ApplicationContext context = new AnnotationConfigApplicationContext(MainConfigAOP.class);
    
        @Test
        public void test(){
    
            MathCalculatorUtils mathCalculatorUtils = context.getBean(MathCalculatorUtils.class);
    
            System.out.println(mathCalculatorUtils.div(100, 10));
    
        }
    
    }
    
  6. 结果

    image-20211112100032797

基本原理

注解@EnableAspectJAutoProxy

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AspectJAutoProxyRegistrar.class})
public @interface EnableAspectJAutoProxy {
    boolean proxyTargetClass() default false;

    boolean exposeProxy() default false;
}

该注解给容器中导入了AspectJAutoProxyRegistrar,该类实现了ImportBeanDefinitionRegistrar接口,可以给容器中注册自定义组件。


http://www.kler.cn/news/18547.html

相关文章:

  • 文心一言 VS chatgpt (6)-- 算法导论2.3 1~2题
  • macOS的CAOpenGLLayer中如何启用OpenGL3.2 core profile
  • Oracle监控账号创建【Prometheus】
  • webstorm 创建harthat项目
  • AI 工具合辑盘点(七)持续更新 之 AI 音乐制作工具
  • 【运动规划算法项目实战】如何利用AABB作碰撞检测(附ROS C++代码)
  • SQL学习日记
  • 从文字到语义:文本分词和词性标注的原理与实现
  • Gradio的web界面演示与交互机器学习模型,安装和使用《1》
  • 拐点已至!被比亚迪赶超,大众中国打响「翻身战」
  • 单元测试 - 集成H2 Dao测测试
  • 【Redis7】Redis7 持久化(重点:RDB与AOF重写机制)
  • 名称空间(namespaces)与作用域
  • [LeetCode周赛复盘] 第 344 场周赛20230507
  • 从不同视角来看待API数据接口
  • Unity用脚本获取物体和组件(下)
  • MySQL基础(三)基本的SELECT语句
  • eSIM证书要求-证书验证-EID
  • 第1章 Nginx简介
  • 187页9万字企业大数据治理与云平台实施方案(word)
  • sentinel 随笔 0-责任链
  • 俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)
  • Scrum敏捷开发工具-单团队敏捷开发管理
  • Linux用户空间与内核空间通信(Netlink通信机制)
  • 三种方法教你让模糊照片秒变高清图
  • 软件工程开发文档写作教程(05)—可行性研究报告写作规范
  • PBDB Data Service:Ecological and taphonomic vocabulary(生态学和埋葬学术语)
  • Ansys Lumerical | CMOS - 光学仿真方法
  • 一场面试下来,狂飙 Framework底层原理
  • 单链表OJ题:LeetCode--206.反转链表