Spring中的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原理与使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java应用启动停止重启Shell脚本模板server.sh
这篇文章主要为大家介绍了Java应用启动、停止、重启Shell脚本模板server.sh,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-08-08
springboot2.5.2与 flowable6.6.0整合流程引擎应用分析
这篇文章主要介绍了springboot2.5.2与 flowable6.6.0整合流程引擎应用分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-07-07
Java中的ArrayList.trimToSize()方法详解
这篇文章主要介绍了Java中的ArrayList.trimToSize()方法详解,前几天看了Java ArrayList,没有明白trimToSize()这个方法是什么意思,所以看了一下源码并且debug一下自己的一个例子,明白了其中的含义,需要的朋友可以参考下2023-11-11
Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码
Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理,Shiro 主要分为两个部分就是认证和授权两部分,这篇文章主要介绍了Springboot+Shiro+Mybatis+mysql实现权限安全认证的示例代码,需要的朋友可以参考下2024-07-07


最新评论