Spring代理对象什么时候创建的,怎么创建(重要)?
动态代理实现
Spring底层的动态代理有两种实现方式,一是JDK的动态代理技术,二是Cglib开源框架提供的动态代理技术。
JDK动态代理
JDK的动态代理,必须是基于接口进行代理,也就是我们的目标类必须实现一个接口,才能进行代理。
创建代理的三个要素:
- 原始对象
- 额外功能
- 代理对象和原始对象实现相同的接口
JDK为我们了提供了Proxy.newInstance(ClassLoader var0, Class<?>[] var1, InvocationHandler var2) 方法类实现动态代理技术。
参数介绍:
- @param: ClassLoader var0: 创建代理对象所需的类加载器
- @param: interfaces: 和原始对象实现的接口数组
- @param: InvocationHandler: 额外功能
这里的InvocatioHandler也是一个接口,所以我们需要传入一个实现。该接口有一个方法需要实现: Object invoke(Object proxy, Method method, Object[] args);
- @param Object proxy:代表代理对象,忽略,不要使用
- @param Methdod method: 代表额外功能增加给的原始方法
- @param Object[] args: 原始方法的参数
- @return: Object: 原始方法的返回值
CGLIB动态代理
JDK的动态代理技术有一个弊端,就是原始类必须要实现一个接口,如果原始类没有实现任何接口,此时想要给它创建动态代理类,JDK的动态代理就实现不了了。而Cglib可以实现。
CGLIb原理:cglib所创建的代理类是通过继承的方式实现的,它会继承原始类。原始类作为父类,代理类作为子类,这样就可以保证二者方法相同。而不需要实现接口。
两种动态代理的区别
- JDK动态代理,Proxy.newInstance:通过接口创建代理的实现类
- CGlib:动态代理, Enhancer(译文:增强者), 通过父子类继承
Spring代理对象是什么时候创建的?
Spring代理对象是怎么创建的?
DefaultListableBeanFactory是AbstractBeanFactory的实现类。
DefaultListableBeanFactory是bean加载的核心部分,是Spring注册及加载的默认实现。
DefaultListableBeanFactory实现接口ConfigurableListableBeanFactory、BeanDefinitionRegistry(bean定义的注册接口)并继承AbstractAutowireCapableBeanFactory,实现全部类管理的功能。
第一种情况:
(1) org.springframework.beans.factory.support.AbstractBeanFactory#getBean
(2) org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean --> Bean实例化的核心逻辑
(3) org.springframework.beans.factory.support.AbstractBeanFactory#createBean --> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean
(4) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
(5) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
(6) org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
调用InstantiationAwareBeanPostProcessor实现类的AbstractAutoProxyCreator的postProcessBeforeInstantiation方法,里面有一个创建代理对象的createProxy方法,并返回代理对象。
(7) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
如果第(6)步返回对象不为空,则调用所有BeanPostProcessor实现类的postProcessAfterInitialization方法。
最终调用org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
(8) org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
(9) org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!