動態代理實現
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