【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动态代理
附加:
【一句话】@Configuration和@Component的区别