如何在程序中直接使用Spring的工具類(lèi)
Spring中存在大量的工具類(lèi),如:RMI相關(guān)的。Spring所提供的 RMI的支持大大簡(jiǎn)化了RMI的開(kāi)發(fā)難度,不過(guò)通常我們都是采用配置的方式,通過(guò)標(biāo)準(zhǔn)的spring bean來(lái)使用它們,這樣雖然簡(jiǎn)化了開(kāi)發(fā),但是也限制了一些靈活性。因?yàn)閎ean的屬性都是在配置時(shí)設(shè)定的(如RMI客戶端中的服務(wù)的URL),而有時(shí)我 們需要在運(yùn)行時(shí)生成這些屬性,這時(shí)其實(shí)只要我們直接使用這些工具類(lèi)就可以了。
要在程序中直接使用RmiProxyFactoryBean,我們就必須了解spring是如何使用這個(gè)類(lèi)為我們生成客戶端代理的,然后在程序中使用與spring相同的調(diào)用方式。
RmiProxyFactoryBean是一個(gè)工廠類(lèi),平時(shí)我們通過(guò)spring獲得的并不是這個(gè)工廠類(lèi)的實(shí)例,而是用這個(gè)工廠類(lèi)創(chuàng)建的proxy的實(shí)例,這個(gè)類(lèi)實(shí)現(xiàn)了spring中標(biāo)準(zhǔn)的FactoryBean接口。FactoryBean接口中定義了三個(gè)方法:
getObject() Return an instance (possibly shared or independent) of the object managed by this factory. | |
getObjectType() Return the type of object that this FactoryBean creates, or null if not known in advance. | |
boolean |
我們通過(guò)getBean獲取這類(lèi)工廠Bean(實(shí)現(xiàn)了FactoryBean接口的Bean)時(shí),spring并不會(huì)返回工廠類(lèi)的實(shí)例,而是調(diào)用工廠類(lèi)的getObject方法并把方法的返回值返回給我們。
這樣你就明白了原來(lái)我們獲得的RMI的Proxy是通過(guò)RmiProxyFactoryBean的getObject方法生成的。
這時(shí)你一定認(rèn)為下面的程序就可以搞定了:
…
RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();
proxy.setServiceInterface(Calculator.class);
proxy.setServiceUrl(url);
Calculator client=(Calculator)proxy.getObject();
System.out.println(client.add(1,1));
…
運(yùn)行程序你會(huì)發(fā)現(xiàn)上面這段程序并不成功,程序會(huì)拋出java.lang.NullPointerException異常。
問(wèn)題在哪里呢?研究一下你會(huì)發(fā)現(xiàn)RmiProxyFactoryBean還實(shí)現(xiàn)了spring的InitializingBean接口,接口中包含一個(gè)方法
afterPropertiesSet
()
,在所有屬性注入完成后spring會(huì)調(diào)用這個(gè)方法,因此上面的程序并沒(méi)有完全正確的模擬spring的調(diào)用過(guò)程。
修改代碼:
…
RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();
proxy.setServiceInterface(Calculator.class);
proxy.setServiceUrl(url);
proxy.afterPropertiesSet();
Calculator client=(Calculator)proxy.getObject();
System.out.println(client.add(1,1));
…
這次終于成功了!
最后,此例告訴大家有時(shí)我們可以直接調(diào)用spring中的工具類(lèi),來(lái)完成我們的特殊需求,此時(shí)要注意的是正確模擬spring的對(duì)bean創(chuàng)建和調(diào)用過(guò)程。
posted on 2007-12-26 17:38 超越巔峰 閱讀(1353) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): Java EE