Spring中的AOP原理与使用详解
作者:程光CS
这篇文章主要介绍了Spring中的AOP原理与使用详解,AOP意为面向切面编程,可以通过预编译方式或运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,需要的朋友可以参考下
一、什么是AOP
AOP (Aspect Oriented Programming) ,意为: 面向切面编程,可以通过预编译方式或运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
AOP的编程思想就是把很多类对象中的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的增加代码的重用性,提高开发效率。
二、AOP的应用场景
三、AOP中的概念定义
通知advice的类型
四、Springboot中如何使用AOP
- SpringBoot项目导入spring-boot-starter-aop依赖
- 编写切面类
- 类上加@Aspect注解,表明这是一个切面类。
- 类上加@Component,把切面交给Spring管理(我们要切的Controller/Service都是Spring容器的,切面要对它们起作用,就必须同样进入容器)
- 类内部配置切点表达式,比如@Pointcut(“execution(* com.bravo.demo.controller..(…))”) 表示对com.bravo.demo.controller包下所有方法进行增强
- 类内部编写通知,有5种注解@Before、 @After、 @AfterReturning、 @AfterThrowing、@Around表示不同的通知类型,分别表示织入到不同的连接点,如@Before(“myPointcut”),myPointcut为定义的切点,表示通知会在方法被调用前执行。SpringBoot会在运行时通过动态代理将切面类中的通知增强代码织入到对应切点的指定连接点位置。
五、AOP使用案例
引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
编写切面类,统计接口耗时
@Slf4j @Aspect //1. 声明这是一个切面类 @Component //2. 交给Spring容器管理 public class ApiTimeLogAspect { // 3. 定义切点表达式,明确要对那些方法起作用(比如,只对com.example.java.controller包的方法计算接口耗时) @Pointcut("execution(* com.example.java.controller.*.*(..))") public void controllerPointcut() { } // 4.定义通知,引用切点表达式。编写增强逻辑 @Around("controllerPointcut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { String className = pjp.getTarget().getClass().toString();//获取类名 String methodName = pjp.getSignature().getName();//获取方法名 Object[] args = pjp.getArgs();//获取请求参数 // 记录接口执行前的时间戳 long startTime = System.currentTimeMillis(); // 实际执行目标方法,类似动态代理的invoke()执行目标方法 Object result = pjp.proceed(); // 计算接口耗时 log.info("------------ {}:{}耗时: {} ms ------------", className, methodName, System.currentTimeMillis() - startTime); // 只做增强不做改变,还是要把接口原本的结果返回 return result; } }
到此这篇关于Spring中的AOP原理与使用详解的文章就介绍到这了,更多相关AOP原理与使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!