<spring> 定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext()

本文详细探讨了在Spring环境下,通过newClassPathXmlApplicationContext()导致定时任务执行异常的问题,并提供了两种解决方法:将定时任务类纳入Spring管理范围或使用ApplicationContextAware获取容器启动时的spring上下文环境。
[b]1.问题描述[/b]
singleton的bean,spring配置定时任务<task:scheduled-tasks>新增一个定时任务后每次触发定时任务都是执行两次。

[b]2.问题分析[/b]
新增的定时任务类有点特殊,里面调用了另一个不受spring管理的对象,这个对象里又需要使用spring管理的单例bean,就在对象里使用了new ClassPathXmlApplicationContext()然后getBean()获取。
一切看似正常,[color=red]问题就出在new ClassPathXmlApplicationContext()这里[/color]。当显式的这样调用的时候,会再次加载bean,初始化spring上下文环境。相当于容器里除了刚启动时的一套之外又产生了一条spring上下文,[color=red]当然定时任务也有了两套。[/color]
这里还说明[color=red]另一个问题,单实例的bean并不是“单例模式”[/color],只是保证一套spring上下文里只有一个bean实例。

[b]3.解决办法[/b]
方法1)把新增的定时任务类也纳入spring管理范围,直接获取其他spring管理的bean.
方法2)使用ApplicationContextAware获取容器启动时的spring上下文环境。

还可以参考:
[url]http://blog.youkuaiyun.com/budapest/article/details/38493003[/url]
[url]http://www.blogjava.net/freeman1984/archive/2010/08/30/330214.html[/url]
### Maven配置中 spring-context 5.1.6.RELEASE junit 4.12 依赖说明 #### spring-context 5.1.6.RELEASE - **配置作用**:`spring-context` 是 Spring 框架的核心模块之一,它提供了 Spring 的应用上下文功能,包括依赖注入、事件机制、资源加载等。`spring-context` 5.1.6.RELEASE 版本提供了该版本下稳定的上下文管理功能,能让开发者在应用中方便地使用 Spring 的各种特性,例如管理 Bean 的生命周期、实现 AOP 等功能。 - **使用方法**:在 Maven 的 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.6.RELEASE</version> </dependency> ``` 添加后,Maven 会自动下载该依赖及其相关的传递依赖。在 Java 代码中,可以通过 `ApplicationContext` 接口来使用 Spring 上下文,示例如下: ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 从上下文中获取 Bean Object bean = context.getBean("beanName"); } } ``` - **可能出现的问题及解决办法**: - **版本冲突**:如果项目中存在其他依赖使用了不同版本的 Spring 库,可能会导致版本冲突。解决办法是使用 Maven 的 `dependencyManagement` 来统一管理 Spring 相关依赖的版本。 - **依赖下载失败**:可能是由于网络问题或 Maven 仓库配置问题导致依赖下载失败。可以检查网络连接,或者更换 Maven 仓库地址。 #### junit 4.12 - **配置作用**:JUnit 是一个广泛使用的 Java 单元测试框架,`junit 4.12` 版本提供了丰富的断言方法测试运行器,用于编写运行单元测试。通过使用 JUnit,可以确保代码的正确性稳定性,提高代码质量。 - **使用方法**:在 Maven 的 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> ``` `scope` 设置为 `test` 表示该依赖只在测试阶段使用。编写测试类示例如下: ```java import org.junit.Test; import static org.junit.Assert.assertEquals; public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); int result = calculator.add(2, 3); assertEquals(5, result); } } ``` - **可能出现的问题及解决办法**: - **测试方法不执行**:可能是测试方法没有使用 `@Test` 注解,或者测试类测试方法的访问修饰符不正确。检查注解访问修饰符是否正确。 - **断言失败**:说明测试的结果与预期不符,需要检查被测试的代码逻辑是否正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值