最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

【SpringBoot】AOP默认的动态代理

来源:博客园

分析:

当引入AOP相关依赖后

            org.springframework            spring-aspects        

Spring启动时会加载AopAutoConfiguration


(资料图)

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

点进去看看:

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

验证一下:

public interface MyService {    void say();}
@Componentpublic class MyServiceImpl implements MyService{    @Override    public void say() {        System.out.println("123");    }}
@Aspect@Componentpublic 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的区别

关键词: 的情况下 使用的是