分析:
当引入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动态代理
附加:
【一句话】@Configuration和@Component的区别
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/206149.html