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 超越巔峰 閱讀(1359) 評論(0)  編輯  收藏 所屬分類: Java EE

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黑河市| 张家港市| 嫩江县| 镇沅| 仁寿县| 牡丹江市| 开远市| 石首市| 北辰区| 平南县| 瑞昌市| 黄平县| 普洱| 镇江市| 东阿县| 吴川市| 清新县| 儋州市| 盐津县| 塔城市| 阜康市| 兰溪市| 五莲县| 广丰县| 太仓市| 托克托县| 法库县| 班玛县| 乌兰县| 鹤庆县| 秦皇岛市| 和政县| 锦屏县| 益阳市| 城市| 文昌市| 石泉县| 威海市| 当雄县| 房山区| 普兰店市|