导航:首页 > 源码编译 > soring动态代理源码

soring动态代理源码

发布时间:2023-03-11 01:50:41

① 2020-07-26 带着疑问看源码 -- springboot aop默认采用什么动态代理机制

了解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动态代理:

注意:配置类生效前提是@ConditionalOnClass(Advice.class),说明只有当引入了依赖项才生效:

而这里推荐使用spring-boot-starter-aop来传递依赖:

这里我们已经看到提供了原生spring的两种代理方式,接着看AopAutoConfiguration源码发现还有个ClassProxyingConfiguration配置类,其生效条件之一是@ConditionalOnMissingClass("org.aspectj.weaver.Advice"),就是当项目里没有aspectjweaver的依赖的时候生效。

我们进入AopConfigUtils.(registry)方法,通过几步调用跳转:

发现会去注册后置处理器,查看源码注释:

表明了只为基础的advisor做动态代理,而忽略应用定义的Advisors,说明项目中我们自定义的切面是不会被AOP代理的。

② spring cglib代理耗时太久

由于整个Spring加载和实例化bean的过程原因导致。
Spring的bean的scope设置成prototype,就是每次都要创建一个实例,可以看一下Spring的源码,创建一个Spring实例是很复杂的一个过程,CGlib代理只是其中的一步,底层也是通过反射完成的,耗时的关键不在CGlib代理,而是在整个Spring加载和实例化bean的过程。
CGlib是属于动态管理,动态代理是在不改变原有代码的情况下上进行对象功能增强,使用代理对象代替原来的对象完成功能,进而达到拓展功能的目的。

阅读全文

与soring动态代理源码相关的资料

热点内容
把pdf导入iphone 浏览:504
米哈游租赁的云服务器是哪个 浏览:522
android直接打电话 浏览:1015
ubuntu停止命令 浏览:283
cnc攻丝编程 浏览:869
换个手机号码app怎么注册 浏览:319
怎么下载小猴口算app 浏览:115
轻链app的货怎么样 浏览:625
电脑里的u盘如何加密 浏览:370
我的世界全部版本服务器下载地址 浏览:49
交换原理pdf 浏览:228
菜鸟驿站app怎么邀请新人 浏览:447
电脑里总是有一些1k的文件夹 浏览:44
drm加密绝对安全 浏览:512
android灭屏流程 浏览:496
如何更改站点文件夹名字 浏览:896
如何看服务器几核 浏览:276
找酒吧设计公司用什么app 浏览:683
基本初等函数的导数公式及导数的运算法则 浏览:917
为什么小米app启动广告关不了 浏览:879