设为首页 加入收藏

TOP

【SpringBoot】AOP默认的动态代理
2023-07-25 21:39:30 】 浏览:29
Tags:SpringBoot AOP

分析:

当引入AOP相关依赖后

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>

Spring启动时会加载AopAutoConfiguration

这个类中通过@EnableAspectJAutoProxy注解开启AOP,代码如下

 点进去看看:

 

 

 可以看到该注解是通过proxyTargetClass参数来控制是否使用Cglib动态代理的,默认值为false,即使用JDK动态代理

验证一下:

public interface MyService {
    void say();
}
@Component
public class MyServiceImpl implements MyService{
    @Override
    public void say() {
        System.out.println("123");
    }
}
@Aspect
@Component
public class AOPTest {

    @Before("execution(* demo.aop.MyServiceImpl.say(..))")
    public void beforeSay() {
        System.out.println("hello");
    }
}

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class AOPTest {
    @Autowired
    MyService myService;

    @Test
    public void test() {
        myService.say();
    }
}

debug执行:

 

嗯?并不是JDK动态代理,用的是Cglib动态代理,跟我们第二张图看到的默认值不一样哎

此时返回去看第一张图,发现 @ConditionalOnProperty 注解下有属性 matchIfMissing = true,即在缺少 proxy-target-class 配置的情况下,会匹配 CglibAutoProxyConfiguration,使用 @EnableAspectJAutoProxy(proxyTargetClass = true),就是使用Cglib动态代理

结论:

SpringBoot 2.x AOP默认使用的是Cglib动态代理

附加:

【学习日志】Cglib动态代理和JDK动态代理的对比

【一句话】@Configuration和@Component的区别

 

 

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Mybatis框架的mapper接口中的方法.. 下一篇Java中如何解析SQL语句、格式化SQ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目