背景: 项目中用到了多数据源,不同的数据源根据业务不同配置在不同的工程中,由maven来统一聚合。但是前几天在开发过程中突然发现项目前台工程的事务配置不起作用了,在之前明明测试过事务功能,当时是生效的。然后检查了一下配置文件中事务部分的配置,发现没什么改动。为了排除其它因素的干扰,采用了单元测试重新测试了一次,结果发现当前数据源事务正常。根据这个分析可能是当前的事务配置被其它配置干扰了,仔细检查了一下后发现罪魁祸首是另外的一个数据源事务配置(在另外的一个配置文件中)的bean id名称和当前的事务配置bean id重复了。
我们都知道,Spring会对同一份配置文件中的bean进行校验,也就是说在同一份配置文件中不允许出现相同的bean定义,会提示报错。但是Spring IOC容器在加载时并不会显示对不同配置文件中重复的bean id进行报错提示,当遇到有重复的bean定义时,Spring采取的策略是把后面加载的配置覆盖前面加载的配置,没有任何警告和提示。
这样很容易造成一个问题是当我们团队进行开发时可能会不小心覆盖别人定义的bean,导致系统出现不可预知的错误和异常。
怎么解决这个问题呢?我们可以配置监听器,在Spring容器启动时对重复的bean进行校验,如果有重复的bean,则报错提示。
因为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
/** * 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文件的监听器配置
<!-- 自定义的ContextLoaderListener --> <listener> <listener-class>com.chenzhou.examples.erm.util.listener.MyContextLoaderListener</listener-class> </listener>
相关推荐
使用监听器对Spring bean id进行唯一校验过程解析 在Spring框架中,bean的定义是非常重要的一部分,而bean的唯一性校验也是一个非常重要的环节。然而,在实际开发中,我们经常会遇到bean id重复的问题,这会导致...
同时,可以利用Spring Boot的事件监听机制,在应用程序启动时执行许可校验,确保在软件运行前完成必要的验证。 总的来说,"基于SpringBoot校验license"项目提供了一个全面的许可管理系统模板,它涵盖了多种常见的...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor ...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...
5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP...
4. **增强的JMS支持**:Spring 2.5增强了对Java消息服务(JMS)的支持,包括模板API和基于注解的消息监听器。 三、Spring 2.5.6源码分析 1. **BeanFactory和ApplicationContext**:源码中可以看到Spring如何通过...
- `@ConfigurationProperties`校验:对配置属性进行校验。 - **Profiles**: - **添加激活的配置(profiles)**:配置多个环境的切换。 - **以编程方式设置profiles**:在代码中动态设置活动的profile。 - **...
这个监听器是Spring Web应用程序的核心组件,它继承自`ContextLoader`,并在Web容器启动时执行`contextInitialized`方法。在这个方法中,`ContextLoader`会调用`initWebApplicationContext`,这是启动Web上下文的...
12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...
5. **Web模块**:为Web应用程序提供基础功能,如Multipart处理和基于Servlet监听器的ApplicationContext初始化。它支持与其他Web框架(如WebWork、Struts)的集成。 6. **Web MVC模块**:Spring的Model-View-...
8.12 使用注解(JSR-303)的Bean校验 341 8.12.1 问题 341 8.12.2 解决方案 342 8.12.3 工作原理 342 8.13 创建Excel和PDF视图 344 8.13.1 问题 344 8.13.2 解决方案 345 8.13.3 工作原理 345 8.14 ...
- `spring-web.jar`:支持Web应用,包括Servlet监听器和Web相关的上下文。 - `spring-aop.jar`:提供面向切面编程(AOP)支持,用于日志、事务管理等功能。 - `spring-expression.jar`:包含强大的表达式语言,...
8.12 使用注解(JSR-303)的Bean校验 341 8.12.1 问题 341 8.12.2 解决方案 342 8.12.3 工作原理 342 8.13 创建Excel和PDF视图 344 8.13.1 问题 344 8.13.2 解决方案 345 8.13.3 工作原理 345 8.14 ...
- **事件监听器** (Event Listener): 通过实现 ApplicationListener 接口来接收事件通知。 #### 八、Spring 在 Web 应用中的使用 - **Web 应用上下文** (WebApplicationContext): 专门为 Web 应用提供的 ...
- **Application事件和监听器**:解释如何利用事件监听机制来增强应用的功能。 - **Web环境**:讨论Spring Boot在不同Web环境下的行为。 - **访问应用参数**:说明如何获取和使用启动时传入的应用参数。 - **...
- spring-web:提供了Web相关的支持,如Servlet监听器、HTTP上下文等。 - spring-webmvc:Spring MVC的实现,处理HTTP请求,提供模型视图控制器的功能。 - spring-aop:支持面向切面编程,可以进行方法拦截、事务...