J2EE之巔

           

          如何在程序中直接使用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
          isSingleton()
                     Is the bean managed by this factory a singleton or a prototype?
          我們通過(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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(12)

          隨筆分類(lèi)(54)

          隨筆檔案(59)

          文章分類(lèi)(2)

          文章檔案(1)

          相冊(cè)

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 新安县| 通江县| 凤庆县| 肃宁县| 泸州市| 香河县| 吉林市| 习水县| 喀喇沁旗| 平原县| 靖西县| 都兰县| 大港区| 定远县| 花垣县| 井冈山市| 桃江县| 浏阳市| 顺昌县| 建昌县| 嘉义县| 库尔勒市| 喜德县| 钟祥市| 桂林市| 福建省| 沙湾县| 五指山市| 长子县| 奉新县| 五台县| 孝昌县| 礼泉县| 普洱| 全南县| 灵川县| 稻城县| 宜川县| 榕江县| 白玉县| 丹江口市|