文章目录
SpringBoot AOP
1. 认识AOP
1.1 AOP概述
AOP即Aspect Oriented Programming,意为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中非常重要的一种思想,也是Spring框架中的一个重要内容,是函数式编程的一种衍生模型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
在平时Java开发中,Spring AOP主要用于日志记录、性能统计、安全控制、事务管理及异常处理等多种场景。
1.2 AOP相关术语
目标对象target
:指的是需要被增强的对象,由于Spring aop是通过代理模式实现,从而这个对象永远是被代理对象。连接点join point
:指的是那些被拦截到的点,在Spring中这些点指的是方法,因为Spring只支持方法类型的连接点。切入点pointcut
:表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。通知advice
:指拦截到连接点之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知等,其中定义了具体要做的操作。引介introduction
:引介是一种特殊的通知,在不修改类代码的前提下,introduction可以在运行期为类动态地添加一些方法或属性。切面aspect
:是切入点和通知的结合。织入weaving
:织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期,类装载期,运行期进行。代理proxy
:一个类被AOP织入增强后,就产生一个结果代理类。
1.3 AOP底层实现
AOP也分为静态AOP与动态AOP。
静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。
动态AOP是指将切面代码进行动态织入实现的AOP。Spring的AOP为动态AOP,实现的技术为JDK提供的动态代理技术 和 CGLIB动态字节码增强技术。
CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。
JDK动态代理是在运行期间,在JVM内部动态生成Class对象。更多内容可参考:https://blog.csdn.net/qq_35006663/article/details/102648760。
2. SpringBoot AOP
前面了解了AOP的一些基本概念,本节就先通过简单的代码,实现SpringBoot中AOP的开发,更清晰的认识一下AOP。
2.1 开发步骤
1)加入依赖,默认就开启了SpringBoot的支持:spring-boot-starter-aop。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2)写一个Aspect,封装横切关注点(日志、监控等),需要配置通知(前置、后置、环绕通知等)、添加切入点(在哪些包的哪些方法执行)。
- 此时需要注意的是切点表达式的定义,Spring中AOP开发,支持一些AspectJ的语法。使用比较多的是execution语法,以下示例中表示范围是aop包及其子包下所有类的方法。
3)添加@Aspect注解,并将该Aspect纳入到Spring容器中。
@Aspect
@Component
public class LogAspect {
@Before("execution(* com.chavaer.springboot.aop..*(..))")
public void logBefore() {
System.out.println("前置通知执行...");
}
@After("execution(* com.chavaer.springboot.aop..*(..))")
public void logAfter() {
System.out.println("后置通知执行...");
}
}
现在写一个测试类,并启动测试:
@Component
public class TestAop {
public void