S2S3H4框架深度集成搭建(1) XmlConfigurationProvider的hashcode的問題

 

最近一直在編寫基於IOC與AOP的web開發框架,有點模仿spring的意思。IOC部分已經差很少了,正在編寫persistence部分。目前所在的公司,初來乍到,並且公司軟件方面之前沒有積累,沒有能直接使用的開發框架,但是如今項目狀況有變,可能留給我本身編寫框架的時間不是太夠,爲了以防萬一,先來套Struts2,spring3,hibernate的整合框架用用,因而開始抽時間搭建。網上查了一些搭建配置的文章,可是都是簡單的拼湊在一塊兒就完事了,沒有深度的集成。 下面就將我在集成的過程當中的一些關鍵的問題的解決,介紹一下。web

Struts2 在集成的時候,配置文件大可能是放置在src的根目錄下就完了。這樣很簡單。可是沒法按照本身工程的結構,進行設計調整。並且也違反了我我的本身多年的習慣。因此第一步將struts的配置放到webapp(上下文)下面的config目錄裏。web.xml進行以下配置。spring

  
  
  
  
  1. <filter> 
  2.         <filter-name>struts2</filter-name> 
  3.         <filter-class>com.xk.commons.config.GeneralConfigFilter</filter-class> 
  4.         <init-param> 
  5.         <param-name>configProviders</param-name> 
  6.         <param-value>com.xk.commons.config.Struts2ConfigurationProvider</param-value> 
  7.        </init-param> 
  8.     </filter> 
  9.     <filter-mapping> 
  10.         <filter-name>struts2</filter-name> 
  11.         <url-pattern>/*</url-pattern> 
  12.     </filter-mapping> 

 Struts2ConfigurationProvider 這個類是繼承了StrutsXmlConfigurationProvider,顧名思義,此類是用來提供xml格式的配置用的。查看類的各類方法,我的理解,只要實現了類的getConfigurationUrls方法,返回的是你本身的配置文件的url就可以修改默認配置了。因而實現代碼以下:app

  
  
  
  
  1. public class Struts2ConfigurationProvider extends StrutsXmlConfigurationProvider  
  2. {  
  3.     private static final String CONFIG_FILE = "struts.xml";  
  4.       
  5.     private static Logger logger = LoggerFactory.getLogger(Struts2ConfigurationProvider.class);  
  6.       
  7.     public Struts2ConfigurationProvider()  
  8.     {  
  9.         this(false);  
  10.     }  
  11.  
  12.     public Struts2ConfigurationProvider(boolean errorIfMissing)  
  13.     {  
  14.         super(CONFIG_FILE, errorIfMissing, null);  
  15.     }  
  16.  
  17.     @Override 
  18.     protected Iterator<URL> getConfigurationUrls(String fileName) throws IOException  
  19.     {  
  20.         logger.info("get struts config file : " + fileName);  
  21.         return PathUtils.getStrutsConfigIterator(fileName);  
  22.     }  

 

 

編寫這個類的時候有點問題,在這裏提一下,若是不提供默認無參構造器,在啓動工程的時候會報錯誤, 框架

  其實這個錯誤發生的緣由就是在實例化這個類的時候,找不到無參構造器。一樣方式,在工程外測試用例測試不會出這樣的問題,僅限於struts2工程內部,不太明白爲何,沒找到緣由,總之,將無參構造器加上,問題解決。 可是工程啓動後,好像不管如何加載不到我本身的配置。因而乎仔細讀源碼,發現Dispatcher類中的init_CustomConfigurationProviders方法是裝載加載自定義配置的地方,其實看上面那個錯誤信息也大概知道地方了。發現雖然本身的Provider類是被實例化了,可是沒有被被加到ConfigurationManager中,再進一步查看,發現ConfigurationManager中的CopyOnWriteArrayList中已經存在要加入的對象了,由於加入的時候會經過實例的equals進行比較。查看相同的對象,發現一個是XmlConfigurationProvider,一個是我本身定義的Struts2ConfigurationProvider,暈了,明明是兩個不一樣的類實例化出的對象,怎麼就能equals爲true呢? 想了辦法,忽然茅塞頓開,若是兩個不一樣的類的實例比較結果是一同樣的,那麼只有一種可能,就是hashcode方法被重寫了。由於equals比較的就是兩個實例的hashcode,沒錯,查看XmlConfigurationProvider的方法,其中果真有hashcode方法,而方法實現又極其簡單。
  
  
  
  
  1. @Override 
  2.    public int hashCode() {  
  3.        return ((configFileName != null) ? configFileName.hashCode() : 0);  
  4.    } 

看吧,只要你經過參數傳遞的配置文件名與struts2中默認的名字是同樣的,那麼hashcode就是同樣的。,雖然不知道struts的開發者這樣設計的目的,可是確定是有緣由的,也罷,將我本身定義的provider中的struts配置文件名字改了一下,既然自定義嗎,那配置文件名稱也要自定義哦。 一些都ok了, 在配置裏寫個簡單的Action,測試經過。webapp

相關文章
相關標籤/搜索