Spring動態代理創建對象過程可分為以下四個步驟:
1)通過實現InvocationHandler接口創建自己的調用處理器 IvocationHandler handler = new InvocationHandlerImpl(...);
2)通過為Proxy類指定ClassLoader對象和一組interface創建動態代理類
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
3)通過反射機制獲取動態代理類的構造函數,其參數類型是調用處理器接口類型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4)通過構造函數創建代理類實例,此時需將調用處理器對象作為參數被傳入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
為了簡化對象創建過程,Proxy類中的newProxyInstance方法封裝了2~4,只需兩步即可完成代理對象的創建。
生成的ProxySubject繼承Proxy類實現Subject接口,實現的Subject的方法實際調用處理器的invoke方法,而invoke方法利用反射調用的是被代理對象的的方法(Object result=method.invoke(proxied,args))cglib動態代理是生成被代理類的子類,並覆蓋其中方法進行增強。
Spring的生命周期:
1)先實例化Bean工廠后處理器(Bean工廠處理器的實例化是先於bean的實例化的)
2)實例化Bean后處理器(BeanPostProcessor)
3)實例化感知的bean后處理器適配器(
InstantiationAwareBeanPostProcessorAdapter)
4)執行Bean構造器,bean正式實例化
在實例化之前會先去調用
postProcessBeforeInstantiation方法;
在實例化之后就去調用
postProcessAfterInitialization方法;
在這里實例化就是調用postProcessPropertyValues去為所要實例化的bean注入屬性。
5)調用BeanNameAware接口
6)調用BeanFactoryAware接口
7)調用Bean后處理器的
postProcessBeforeInstantiation方法對屬性進行更改
8)調用
InitializingBean.afterPropertiesSet() ,檢查是否已經set所有必要屬性,之后調用的init-method屬性指定的初始化方法
9)調用Bean后處理器的
postProcessAfterInitialization對屬性進行更改
10)調用后處理器適配器的
postProcessAfterInitialization
11)容器初始化成功,使用bean
12)調用DiposibleBean接口的DiposibleBean.destory()
【免責聲明:本文圖片及文字信息均由千鋒重慶Java培訓小編轉載自網絡,旨在分享提供閱讀,版權歸原作者所有,如有侵權請聯系我們進行刪除。】