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默认采用啥动态代理机制的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch源码 写入分析

Elasticsearch源码 写入分析

Elasticsearch源码 检索分析

Elasticsearch源码 检索分析

Elasticsearch源码 节点关闭分析

Elasticsearch源码 节点关闭分析