• springAOP落地实现



    前言

    江湖阳哥曾经说过这么句话:
    使用技术在当前这个环境中无非就是这么几步:
    1、引入POM(maven)坐标
    2、改yml(配置文件也可以是properties等等)
    3、写配置类或者在启动类上加注解
    4、写代码就完事


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、熟悉相关概念:

    Spring AOP中,注解是
    定义切面(Aspects)、切点(Pointcuts)、通知(Advice)等的主要方式。
    以下是Spring AOP中几种常见的注解及其用途和如何使用:

    1、@Aspect:

    • 作用:标识一个类为切面类。
    • 使用方式:将此注解标注在类上,这个类会包含切点和通知的定义。
    • 示例:
    @Aspect
    public class MyAspect {
        // 切点和通知定义...
    }
    
    • 1
    • 2
    • 3
    • 4

    2、@Pointcut:

    • 作用:定义一个切点,即横切关注点的入口,明确什么样的方法调用会被拦截。
    • 使用方式:在方法声明前使用此注解,并提供一个切点表达式,该方法本身通常是空方法,仅作为切点的引用。
    • 示例:
    @Aspect
    public class MyAspect {
        @Pointcut("execution(* com.example.service.*.*(..))")
        public void serviceMethod() {}
        // 其他通知...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、@Before:

    • 作用:定义一个前置通知,在切点的方法执行之前执行。
    • 使用方式:将此注解放在一个方法上,该方法将在目标方法执行前执行。
    • 示例:
    @Aspect
    public class MyAspect {
        @Before("serviceMethod()")
        public void beforeServiceMethod() {
            // 前置逻辑...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4、@AfterReturning:

    • 作用:定义一个返回后通知,如果切点的方法正常返回后执行。
    • 使用方式:将此注解放在一个方法上,并通过该方法提供的参数记入返回的值。
    • 示例:
    @Aspect
    public class MyAspect {
        @AfterReturning(pointcut = "serviceMethod()", returning = "retVal")
        public void afterReturning(Object retVal) {
            // 处理返回值...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、@AfterThrowing:

    • 作用:定义一个异常通知,如果切点的方法抛出异常后执行。
    • 使用方式:将此注解放在一个方法上,并可选地获取抛出的异常。
    • 示例:
    @Aspect
    public class MyAspect {
        @AfterThrowing(pointcut = "serviceMethod()", throwing = "ex")
        public void afterThrowing(Exception ex) {
            // 异常处理...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6、@After:

    • 作用:定义一个最终通知,无论切点的方法是正常返回还是抛出异常都会执行。
    • 使用方式:将此注解放在一个方法上,该方法无论目标方法如何都会执行。
    • 示例:
    @Aspect
    public class MyAspect {
        @After("serviceMethod()")
        public void afterServiceMethod() {
            // 最终逻辑...
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    7、@Around:

    • 作用:定义一个环绕通知,可以自定义在目标方法前后执行的逻辑,同时决定是否继续执行目标方法。
    • 使用方式:将此注解放在一个方法上,该方法需要返回一个Object,可能是目标方法的返回值,也可能是你自定义的返回值。你可以在此方法中直接调用目标方法。
    • 示例:
    @Aspect
    public class MyAspect {
        @Around("serviceMethod()")
        public Object aroundServiceMethod(ProceedingJoinPoint pjp) throws Throwable {
            // 前置逻辑...
            Object result = pjp.proceed(); // 执行目标方法
            // 后置逻辑...
            return result;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Spring AOP的使用通常有两种方式:

    通过注解驱动的方式:在配置类上使用 @EnableAspectJAutoProxy 注解开启AOP支持,然后声明切面类和相关注解。

    通过XML配置的方式:在XML文件中定义 aop:config 元素,并在该元素内部配置切面和通知。

    通常情况下,注解驱动的方式更简洁直观,且是推荐的做法。不过,在某些用例或旧项目中,XML配置方式可能还是会用到。

    二、具体使用case:

    当然,让我们以一个简单的AOP用例为例,实现一个记录方法执行时间的切面。首先确保您的项目已经加入了Spring AOP的相关依赖,例如,使用Maven时,您可以添加下列依赖到您的pom.xml文件:

    1.pom文件

    <!-- Spring AOP 依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.3.18</version>
    </dependency>
    <!-- AOP联盟API -->
    <dependency>
        <groupId>aopalliance</groupId>
        <artifactId>aopalliance</artifactId>
        <version>1.0</version>
    </dependency>
    <!-- Spring框架的一部分,用于处理AOP的代理 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.3.18</version>
    </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.代码

    现在,让我们创建一个切面,该切面会记录方法执行的时间:

    // 具有@Aspect注解的类会被Spring识别为一个切面
    @Aspect
    // 确保这个类被Spring的容器扫描到,通常它应该位于@ComponentScan指定的包或子包中
    @Component
    public class PerformanceAspect {
    
        // 切点表达式,这里是指任意返回值的Service层中的任意方法
        @Pointcut("execution(* com.example.service.*.*(..))")
        public void serviceMethod() {}
    
        // 环绕通知,让我们可以在方法执行前后添加自定义逻辑
        @Around("serviceMethod()")
        public Object profile(ProceedingJoinPoint pjp) throws Throwable {
            long start = System.currentTimeMillis(); // 开始时间
            Object output = pjp.proceed(); // 执行被代理的方法
            long elapsedTime = System.currentTimeMillis() - start; // 计算消耗的时间
            System.out.println("Method execution time: " + elapsedTime + " milliseconds.");
            return output; // 返回被代理方法的返回值
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    然后,你需要在Spring的配置类加入如下内容,以启用AOP的自动代理功能:

    @Configuration
    @EnableAspectJAutoProxy
    @ComponentScan("com.example") // 修改为你的包名
    public class AppConfig {
        // 可以添加额外的Bean配置...
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    现在,你的AOP切面已经准备好了。当你的程序运行时,任何匹配Pointcut(位于com.example.service包的任意方法)的方法都会被PerformanceAspect所拦截,它会在方法执行前后记录执行时间,并将该时间打印到控制台。
    假设我们有一个简单的服务类:

    package com.example.service;
    
    import org.springframework.stereotype.Service;
    
    @Service
    public class SimpleService {
    
        public void doSomething() {
            // 模拟业务逻辑处理时间
            try {
                Thread.sleep(1000); 
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    当你调用SimpleService类的doSomething方法时,上述的PerformanceAspect会自动拦截此调用,并且记录该方法的执行时间。这样你就完成了一个针对Spring的AOP入门级案例。


    总结

    好了尽情的开发使用吧,其实这个是为了我写那个面试题的文章准备的哈哈哈哈

  • 相关阅读:
    河南省文化旅游发展相关统计数据(2014-2023年)
    【R语言】【3】apply,tapply,lapply,sapply,mapply与par函数相关参数
    java基于ssm的在线IT项目任务管理系统
    Spring boot项目配置
    Allegro如何给铜皮导弧操作详解
    worthington酶丨worthington温度对酶活性的影响
    下载工程resources目录下的模板excel文件
    本地link跳转ok 部署后nginx报错跳404页面的原因及解决办法
    TFN MIX5 500 手持式光谱仪 合金分析仪 便携式X荧光光谱仪 合金手持式光谱仪
    探索直播美颜SDK的未来发展方向:虚拟现实、增强现实与混合
  • 原文地址:https://blog.csdn.net/sutingStart/article/details/136289381