使用監聽器對Spring bean id進行唯一校驗
阿新 • • 發佈:2019-02-09
因為Spring IOC容器啟動載入時會檢查bean定義是否有重複,如果有重複則會根據AbstractRefreshableApplicationContext類中的allowBeanDefinitionOverriding屬性值進行判斷,如果值為true,則把後加載的bean覆蓋前面載入的bean定義,如果為false則丟擲BeanDefinitionStoreException異常。 所以,解決這個問題的辦法就比較簡單了,只要將這個allowBeanDefinitionOverriding值在spring初始化的時候設定為false就行了。具體步驟如下:
1.自定義一個ContextLoader
- /**
- * ClassName:MyContextLoader <br/>
- * Function: 自定義ContextLoader. <br/>
- * Date: 2013-1-18 下午03:53:16 <br/>
- * @author chenzhou
- * @version
- * @since JDK 1.6
- */
- public class MyContextLoader extends ContextLoader {
- /**
- * 設定allowBeanDefinitionOverriding屬性為false,spring ioc容器在載入bean的過程中會去判斷beanName 是否有重複,. <br/>
- * 如果發現重複的話再根據allowBeanDefinitionOverriding 這個成員變數,. <br/>
- * 如果是false的話則丟擲BeanDefinitionStoreException 這個異常,如果為true的話就會覆蓋這個bean的定義. <br/>
- * @see org.springframework.web.context.ContextLoader#customizeContext(javax.servlet.ServletContext,
- * org.springframework.web.context.ConfigurableWebApplicationContext)
- */
- @Override
- protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext applicationContext){
- super.customizeContext(servletContext, applicationContext);
- XmlWebApplicationContext context = (XmlWebApplicationContext) applicationContext;
- //設定allowBeanDefinitionOverriding屬性為false
- context.setAllowBeanDefinitionOverriding(false);
- }
- }
2.自定義一個ContextLoaderListener
Java程式碼- /**
- * ClassName:MyContextLoaderListener <br/>
- * Function: 自定義ContextLoaderListener. <br/>
- * Date: 2013-1-18 下午04:12:00 <br/>
- * @author chenzhou
- * @version
- * @since JDK 1.6
- */
- public class MyContextLoaderListener extends ContextLoaderListener {
- @Override
- protected ContextLoader createContextLoader(){
- return new MyContextLoader();
- }
- }
3.修改web.xml檔案的監聽器配置
Xml程式碼- <!-- 自定義的ContextLoaderListener -->
- <listener>
- <listener-class>com.chenzhou.examples.erm.util.listener.MyContextLoaderListener</listener-class>
- </listener>