【SpringBoot】AOP默认的动态代理

打印 上一主题 下一主题

主题 1061|帖子 1061|积分 3183

分析:
当引入AOP相关依赖后
  1.         <dependency>
  2.             <groupId>org.springframework</groupId>
  3.             <artifactId>spring-aspects</artifactId>
  4.         </dependency>
复制代码
Spring启动时会加载AopAutoConfiguration
这个类中通过@EnableAspectJAutoProxy注解开启AOP,代码如下

 
 
 点进去看看:

 
 
 可以看到该注解是通过proxyTargetClass参数来控制是否使用Cglib动态代理的,默认值为false,即使用JDK动态代理
验证一下:
  1. public interface MyService {
  2.     void say();
  3. }
复制代码
  1. @Component
  2. public class MyServiceImpl implements MyService{
  3.     @Override
  4.     public void say() {
  5.         System.out.println("123");
  6.     }
  7. }
复制代码
  1. @Aspect
  2. @Component
  3. public class AOPTest {
  4.     @Before("execution(* demo.aop.MyServiceImpl.say(..))")
  5.     public void beforeSay() {
  6.         System.out.println("hello");
  7.     }
  8. }
复制代码
测试类:
  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest(classes = DemoApplication.class)
  3. public class AOPTest {
  4.     @Autowired
  5.     MyService myService;
  6.     @Test
  7.     public void test() {
  8.         myService.say();
  9.     }
  10. }
复制代码
debug执行:

 
 
 嗯?并不是JDK动态代理,用的是Cglib动态代理,跟我们第二张图看到的默认值不一样哎
此时返回去看第一张图,发现 @ConditionalOnProperty 注解下有属性 matchIfMissing = true,即在缺少 proxy-target-class 配置的情况下,会匹配 CglibAutoProxyConfiguration,使用 @EnableAspectJAutoProxy(proxyTargetClass = true),就是使用Cglib动态代理
结论:
SpringBoot 2.x AOP默认使用的是Cglib动态代理
附加:
【学习日志】Cglib动态代理和JDK动态代理的对比
【一句话】@Configuration和@Component的区别
 
 

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表