Spring代理对象什么时候创建的,怎么创建(重要)?

动态代理实现

Spring底层的动态代理有两种实现方式,一是JDK的动态代理技术,二是Cglib开源框架提供的动态代理技术。

JDK动态代理

JDK的动态代理,必须是基于接口进行代理,也就是我们的目标类必须实现一个接口,才能进行代理。

创建代理的三个要素:

  1. 原始对象
  2. 额外功能
  3. 代理对象和原始对象实现相同的接口

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

 

posted @ 2021-12-13 21:18  残城碎梦  阅读(1793)  评论(0编辑  收藏  举报