Spring代理对象什么时候创建的,怎么创建(重要)?
动态代理实现
Spring底层的动态代理有两种实现⽅式,⼀是JDK的动态代理技术,⼆是Cglib开源框架提供的动态代理技术。
JDK动态代理
JDK的动态代理,必须是基于接⼝进⾏代理,也就是我们的⽬标类必须实现⼀个接⼝,才能进⾏代理。jdk怎么使用
创建代理的三个要素:
原始对象
额外功能
代理对象和原始对象实现相同的接⼝
JDK为我们了提供了wInstance(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动态代理,wInstance:通过接⼝创建代理的实现类
CGlib:动态代理, Enhancer(译⽂:增强者), 通过⽗⼦类继承
Spring代理对象是什么时候创建的?
Spring代理对象是怎么创建的?
DefaultListableBeanFactory是AbstractBeanFactory的实现类。
DefaultListableBeanFactory是bean加载的核⼼部分,是Spring注册及加载的默认实现。
DefaultListableBeanFactory实现接⼝ConfigurableListableBeanFactory、BeanDefinitionRegistry(be
an定义的注册接⼝)并继承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.fig.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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论