目录
一、对于AOP的理解
二、Spring是如何实现AOP的
1、execution表达式
2、@annotation
3、基于Spring API,通过xml配置的方式。
4、基于代理实现
三、Spring AOP的实现原理
四、Spring是如何选择使用哪种动态代理
1、Spring Framework
2、Spring Boot
五、基于Spring Boot观察动态代理
1、类实现接口且未配置
2、类未实现接口且未配置
3、类实现接口且配置
4、类未实现接口且配置
一、对于AOP的理解
AOP是一种思想,是对一类事情集中处理。比如:对于一个项目中的不同方法,想计算每个方法运行消耗时间,若在每个方法体里实现一遍计算时间,代码不断重复。此时,我们就可以利用AOP思想集中计算时间。
二、Spring是如何实现AOP的
Spring实现AOP有两种实现方式:execution表达式和@annotation
1、execution表达式
例如:execution(public String com.example.demo.Controller.testController())
2、@annotation
(1)实现步骤
①编写自定义注解;
②使用@annotation表达式来描述切点表达式;
③在连接点的方法上加上自定义注解。
3、基于Spring API,通过xml配置的方式。
4、基于代理实现
三、Spring AOP的实现原理
Spring AOP是基于动态代理实现的,常见的实现方式:JDK动态代理和CGLIB动态代理。
四、Spring是如何选择使用哪种动态代理
1、Spring Framework
如果代理的是接口,使用JDK动态代理。如果代理的是没有实现接口的类,使用CGLIB动态代理。
2、Spring Boot
(1)Spring Boot 2.x之前
和Spring Framework保持一致;代理的是接口,使用JDK动态代理;代理的是没有实现接口的类,使用CGLIB动态代理。
(2)Spring Boot 2.x之后
无论类是否实现接口,默认使用CGLIB动态代理。需要使用CGLIB代理时,可以通过配置项进行修改:spring.aop.proxy-target-class=false,若类实现了接口且至少有一个方法实现,则使用JDK动态代理,否则使用CGLIB动态代理。
五、基于Spring Boot观察动态代理
1、类实现接口且未配置
运行结果(CGLIB代理):
2、类未实现接口且未配置
运行结果(CGLIB代理):
3、类实现接口且配置
配置:
运行结果(JDK代理):
4、类未实现接口且配置
配置:
运行结果(CGLIB代理):