导航:首页 > 源码编译 > 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动态代理源码相关的资料

热点内容
服务器第一地址怎么改 浏览:494
单片机最小系统电路设计流程图 浏览:663
steam源码 浏览:29
关于对数的运算法则及公式 浏览:775
明星谈如何缓解压力 浏览:141
androidlistview隐藏列 浏览:396
plc跑马灯编程 浏览:816
ios开发之网络编程 浏览:421
处理照片视频哪个app好 浏览:386
logback压缩 浏览:888
冰箱压缩机可以用气割吗 浏览:531
菜鸟如何加密商品信息 浏览:315
程序员那么可爱小说结局 浏览:866
zenity命令 浏览:570
监禁风暴哪个app有 浏览:871
程序员的爱心是什么 浏览:595
java中对字符串排序 浏览:296
单片机用数模转换生成三角波 浏览:640
外网怎么登陆服务器地址 浏览:140
什么人要懂编译原理 浏览:154