2020-07-26 带着疑问看源码 -- springboot aop默认采用啥动态代理机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-07-26 带着疑问看源码 -- springboot aop默认采用啥动态代理机制相关的知识,希望对你有一定的参考价值。
参考技术A 了解springboot aop的动态代理方式有哪些种类?有3种,前提均开启spring.aop.auto=true:
1. jdk动态代理:当spring.aop.proxy-target-class=false, 引入了aspectjweaver依赖时生效
2. cglib代理:当spring.aop.proxy-target-class=true, 引入了aspectjweaver依赖时生效
3. 基础代理:当spring.aop.proxy-target-class=true, 若没有aspectjweaver依赖时生效,只作用于框架内部的advisors,
我们既然用springboot那么就采用springboot的AopAutoConfiguration自动配置类来加载aop机制的,内部对@EnableAspectJAutoProxy进行了封装,扩展了一些配置项,同时还提供了ClassProxyingConfiguration配置(下面会讲到).
这个自动装配类会是spring boot框架自动会装配的,所以说默认aop机制是打开的,可以通过配置项:spring.aop.auto=false 手工关闭。
这个配置类会根据spring.aop.proxy-target-class配置项来决定采用jdk动态代理或者cglib动态代理:
注意:AspectJAutoProxyingConfiguration配置类生效前提是@ConditionalOnClass(Advice.class),说明只有当引入了依赖项才生效:
而这里推荐使用spring-boot-starter-aop来传递依赖:
这里我们已经看到提供了原生spring的两种代理方式,接着看AopAutoConfiguration源码发现还有个ClassProxyingConfiguration配置类,其生效条件之一是@ConditionalOnMissingClass("org.aspectj.weaver.Advice"),就是当项目里没有aspectjweaver的依赖的时候生效。
我们进入AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry)方法,通过几步调用跳转:
发现会去注册InfrastructureAdvisorAutoProxyCreator后置处理器,查看源码注释:
表明了InfrastructureAdvisorAutoProxyCreator只为基础的advisor做动态代理,而忽略应用定义的Advisors,说明项目中我们自定义的切面是不会被AOP代理的。
以上是关于2020-07-26 带着疑问看源码 -- springboot aop默认采用啥动态代理机制的主要内容,如果未能解决你的问题,请参考以下文章