`
足至迹留
  • 浏览: 485321 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

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

阅读更多
1.问题描述
singleton的bean,spring配置定时任务<task:scheduled-tasks>新增一个定时任务后每次触发定时任务都是执行两次。

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

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

还可以参考:
http://blog.csdn.net/budapest/article/details/38493003
http://www.blogjava.net/freeman1984/archive/2010/08/30/330214.html
1
0
分享到:
评论
1 楼 zhanggang807 2018-04-04  
第二种方法比较好

相关推荐

    spring aop 实现源代码--xml and annotation(带lib包)

    Spring在真正执行目标对象的方法前,会执行interceptorNames中执行的Advice,每个Advice在执行完自己的业务后,会调用MethodInvocation的proceed()方法,将执行的主动权移交给下一个Advice,直到没有下一个Advice...

    基于java的企业级应用开发:Spring的核心容器.ppt

    spring/applicationContext.xml &lt;/param-value&gt; &lt;/context-param&gt; &lt;listener&gt; &lt;listener-class&gt; org.springframework.web.context.ContextLoaderListener &lt;/listener-class&gt; &lt;/listener&gt; ApplicationContext * * * *...

    springmybatis

    1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 &lt;typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/&gt; 这个别名...

    Spring原理模拟代码

    private Map&lt;String, Object&gt; beans = new HashMap&lt;String, Object&gt;(); @SuppressWarnings("unchecked") public ClassPathXmlApplicationContext() throws Exception { SAXBuilder sb = new SAXBuilder(); ...

    模拟spring中的ClassPathXmlApplicationContext类的实现

    NULL 博文链接:https://gaojiewyh.iteye.com/blog/409606

    客户关系管理系统框架搭建(二)

    &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;property name="configLocation"&gt; &lt;!--表示在类路径下加载hibernate.cfg.xml --&gt; &lt;value&gt;...

    spring容器的触发事件 ClassPathXmlApplicationContext的start()方法的用法

    spring容器的触发事件 ClassPathXmlApplicationContext的start()方法的用法

    Spring.html

    --全局初始化参数--&gt; &lt;context-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;classpath:applicationContext.xml&lt;/param-value&gt; &lt;/context-param&gt; 4.在Servlet中使用...

    spring的基础(一)自己写的ClassPathXmlApplicationContext类

    NULL 博文链接:https://cuiran.iteye.com/blog/487385

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程式事务管理 9.6.1. 使用 ...

    spring技术入门相关源码

    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //输出spring容器 System.out.println(ctx); //打印加载的bean名称 System.out.println(java.util.Arrays....

    spring结合mongodb例子(maven java project)

    例子简单的实现了spring结合mongo的例子 ...通过ApplicationContext applicationContext = new ClassPathXmlApplicationContext("mongo.xml");加载方式:App.java 3.列出log日志的java代码获取方式

    spring为ApplicationContext提供的3种实现分别为:ClassPathXmlApplicationContext

    NULL 博文链接:https://canfly2010.iteye.com/blog/443063

    maven相关资料

    Spring中ClassPathXmlApplicationContext类的简单使用 Posted on 2011-06-22 17:08 xcp 阅读(14689) 评论(0) 编辑 收藏 所属分类: Spring 一、简单的用ApplicationContext做测试的话,获得Spring中定义的Bean实例...

    spring核心

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); (2)ApplicationContext context = new FileSystemXmlApplicationContext ("applicationContext.xml"); 一般用第...

    spring读取配置文件

    spring读取配置不同目录下的配置文件,使用ClassPathXmlApplicationContext与FileSystemXmlApplicationContext

    手写SpringIoc的XML实现方式

    手写SpringIoc的XML实现方式,仿照Spring底层Bean工厂类实现ClassPathXmlApplicationContext

    spring.xls

    spring的IOC: * IOC:spring容器控制对象的生命周期:前提条件:在spring容器中的bean必须是单例... * 如果是单例,则必须返回ClassPathXmlApplicationContext该容器,才能执行销毁工作 * 如果是多例,容器不负责销毁

    Spring入门.docx

    一、Spring基础 1.Xml配置Bean (1)DI注入属性:name为set方法去掉set之后首字母小写,ref为bean的id,需要有set方法,Spring会自动调用进行注入 (2)BeanFactory与ApplicationContext: ApplicationContext内部...

Global site tag (gtag.js) - Google Analytics