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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM