J2EE之巔

           

          如何在程序中直接使用Spring的工具類

          Spring中存在大量的工具類,如:RMI相關的。Spring所提供的 RMI的支持大大簡化了RMI的開發難度,不過通常我們都是采用配置的方式,通過標準的spring bean來使用它們,這樣雖然簡化了開發,但是也限制了一些靈活性。因為bean的屬性都是在配置時設定的(如RMI客戶端中的服務的URL),而有時我 們需要在運行時生成這些屬性,這時其實只要我們直接使用這些工具類就可以了。
          要在程序中直接使用RmiProxyFactoryBean,我們就必須了解spring是如何使用這個類為我們生成客戶端代理的,然后在程序中使用與spring相同的調用方式。
          RmiProxyFactoryBean是一個工廠類,平時我們通過spring獲得的并不是這個工廠類的實例,而是用這個工廠類創建的proxy的實例,這個類實現了spring中標準的FactoryBean接口。FactoryBean接口中定義了三個方法:
          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?
          我們通過getBean獲取這類工廠Bean(實現了FactoryBean接口的Bean)時,spring并不會返回工廠類的實例,而是調用工廠類的getObject方法并把方法的返回值返回給我們。
          這樣你就明白了原來我們獲得的RMI的Proxy是通過RmiProxyFactoryBean的getObject方法生成的。
          這時你一定認為下面的程序就可以搞定了:
                        …
          RmiProxyFactoryBean proxy=new RmiProxyFactoryBean();           
                        proxy.setServiceInterface(Calculator.class);
                        proxy.setServiceUrl(url);
                        Calculator client=(Calculator)proxy.getObject();         
                        System.out.println(client.add(1,1));
                        …
          運行程序你會發現上面這段程序并不成功,程序會拋出java.lang.NullPointerException異常。
          問題在哪里呢?研究一下你會發現RmiProxyFactoryBean還實現了spring的InitializingBean接口,接口中包含一個方法afterPropertiesSet(),在所有屬性注入完成后spring會調用這個方法,因此上面的程序并沒有完全正確的模擬spring的調用過程。
          修改代碼:
          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));
                        …
          這次終于成功了!

          最后,此例告訴大家有時我們可以直接調用spring中的工具類,來完成我們的特殊需求,此時要注意的是正確模擬spring的對bean創建和調用過程。

          posted on 2007-12-26 17:38 超越巔峰 閱讀(1354) 評論(0)  編輯  收藏 所屬分類: Java EE

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 湖口县| 桐庐县| 清丰县| 沙湾县| 鄂尔多斯市| 当雄县| 华坪县| 手游| 安阳县| 廊坊市| 民县| 措美县| 鹤壁市| 界首市| 勃利县| 红桥区| 澳门| 柳州市| 三江| 河西区| 津南区| 乃东县| 石台县| 专栏| 濮阳县| 鄂温| 耒阳市| 怀集县| 正蓝旗| 水富县| 怀安县| 临澧县| 乌恰县| 淳安县| 平塘县| 苗栗县| 内乡县| 淮阳县| 罗源县| 惠州市| 商河县|