1. 程式人生 > >使用監聽器對Spring bean id進行唯一校驗

使用監聽器對Spring bean id進行唯一校驗

       因為Spring IOC容器啟動載入時會檢查bean定義是否有重複,如果有重複則會根據AbstractRefreshableApplicationContext類中的allowBeanDefinitionOverriding屬性值進行判斷,如果值為true,則把後加載的bean覆蓋前面載入的bean定義,如果為false則丟擲BeanDefinitionStoreException異常。 所以,解決這個問題的辦法就比較簡單了,只要將這個allowBeanDefinitionOverriding值在spring初始化的時候設定為false就行了。具體步驟如下:

1.自定義一個ContextLoader

Java程式碼  收藏程式碼
  1. /** 
  2.  * ClassName:MyContextLoader <br/> 
  3.  * Function: 自定義ContextLoader. <br/> 
  4.  * Date:     2013-1-18 下午03:53:16 <br/> 
  5.  * @author   chenzhou 
  6.  * @version   
  7.  * @since    JDK 1.6 
  8.  */  
  9. public class MyContextLoader extends ContextLoader {  
  10.     /** 
  11.      * 設定allowBeanDefinitionOverriding屬性為false,spring ioc容器在載入bean的過程中會去判斷beanName 是否有重複,. <br/>
     
  12.      * 如果發現重複的話再根據allowBeanDefinitionOverriding 這個成員變數,. <br/> 
  13.      * 如果是false的話則丟擲BeanDefinitionStoreException 這個異常,如果為true的話就會覆蓋這個bean的定義. <br/> 
  14.      * @see org.springframework.web.context.ContextLoader#customizeContext(javax.servlet.ServletContext,  
  15.      *      org.springframework.web.context.ConfigurableWebApplicationContext)
     
  16.      */  
  17.     @Override  
  18.     protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext applicationContext){  
  19.         super.customizeContext(servletContext, applicationContext);  
  20.         XmlWebApplicationContext context = (XmlWebApplicationContext) applicationContext;  
  21.         //設定allowBeanDefinitionOverriding屬性為false  
  22.         context.setAllowBeanDefinitionOverriding(false);  
  23.     }  
  24. }  

 2.自定義一個ContextLoaderListener

Java程式碼  收藏程式碼
  1. /** 
  2.  * ClassName:MyContextLoaderListener <br/> 
  3.  * Function: 自定義ContextLoaderListener. <br/> 
  4.  * Date:     2013-1-18 下午04:12:00 <br/> 
  5.  * @author   chenzhou 
  6.  * @version   
  7.  * @since    JDK 1.6 
  8.  */  
  9. public class MyContextLoaderListener extends ContextLoaderListener {  
  10.     @Override  
  11.     protected ContextLoader createContextLoader(){  
  12.         return new MyContextLoader();  
  13.     }  
  14. }  

 3.修改web.xml檔案的監聽器配置

Xml程式碼  收藏程式碼
  1. <!-- 自定義的ContextLoaderListener -->  
  2. <listener>  
  3.     <listener-class>com.chenzhou.examples.erm.util.listener.MyContextLoaderListener</listener-class>  
  4. </listener>