SpringMVC开发@Component注解类被两次实例化问题分析与解决
2013-12-27 16:45
507 查看
需要写一个Job类,思路是利用Job实例初始化的时候启动一个ScheduleExecutorTask,定时update一些东西。
Component本来是单例的,@PostConstruct是在实例化完成后调用的方法。但是日志中start()出现了两次,并且this的地址不同,很明显,RefreshJob实例化了两次,造成两个Job实例在同时运行。
求Google,结合两篇文章的答案,分析得出:
web.xml中的DispatcherServlet继承自ContextLoaderListener,两者共用ApplicationContext,但是在启动的时候,会分别调用initWebApplicationContext()方法,各自对@Component注解对象实例化一次,DispatcherServlet调用在后,在Controller中使用的是后面实例化的对象。
牛人A修改了Spring的源代码解决之,但是后续影响未见其返回。
文章中进一步解释其实例化类的范围不同,ContextLoaderListerner实例化DataSource/Dao/Service等其他Bean,DispatcherServlet初始化Controller/ViewResolver/HandlerMapping/HandlerAdapter相关web类。
但是不知为何@Component注解的类这两次都不放过。
于是将@Component注解修改为@Service,日志中start()只打印一次了,解决之。
参考文章:
/article/5900250.html
/article/10367760.html
@Component("RefreshJob") public class RefreshJob{ @PostConstruct public void start(){ logger.info("start()". + this); ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1); executor.scheduleAtFixedRate(new Runnable(){ public void run(){ try{ update(); } catch(Exception exp){ } } }, 0, 1, TimeUnit.MINUTES); }
Component本来是单例的,@PostConstruct是在实例化完成后调用的方法。但是日志中start()出现了两次,并且this的地址不同,很明显,RefreshJob实例化了两次,造成两个Job实例在同时运行。
求Google,结合两篇文章的答案,分析得出:
web.xml中的DispatcherServlet继承自ContextLoaderListener,两者共用ApplicationContext,但是在启动的时候,会分别调用initWebApplicationContext()方法,各自对@Component注解对象实例化一次,DispatcherServlet调用在后,在Controller中使用的是后面实例化的对象。
牛人A修改了Spring的源代码解决之,但是后续影响未见其返回。
文章中进一步解释其实例化类的范围不同,ContextLoaderListerner实例化DataSource/Dao/Service等其他Bean,DispatcherServlet初始化Controller/ViewResolver/HandlerMapping/HandlerAdapter相关web类。
但是不知为何@Component注解的类这两次都不放过。
于是将@Component注解修改为@Service,日志中start()只打印一次了,解决之。
参考文章:
/article/5900250.html
/article/10367760.html
相关文章推荐
- SpringMVC开发@Component注解类被两次实例化问题分析与解决
- SpringMVC开发@Component注解类被两次实例化问题分析与解决
- SpringMVC之前后台分离开发,联调时的跨域问题的解决方法
- iOS开发如何通过UMeng的错误分析解决crash问题
- Hibernate开发常见问题的分析解决
- java开发踩坑(2)-解决springmvc传值中文乱码问题
- IntelliJIdea 2016.2 使用 tomcat 8.5 调试spring的web项目时,bean被实例化两次导致timer和thread被启动了两遍的问题的解决
- springMVC实现REST开发详解(补充Json解析问题以及静态文件404错误解决办法)
- iOS开发之Xcode的静态分析(Static Code Analysis)与常见问题解决
- 微信开发之php表单微信中自动提交两次问题解决办法
- spring和springmvc的扫描组件的配置,解决多次实例化问题
- EAS的WAF2开发中WEB方案对应的表结构及问题分析解决总结
- JSP、AJax中文乱码问题解决,escape(), encodeURI(), encodeURIComponent(),js对参数连续两次调用 encodeURI(String) 方法
- SpringMVC解决多人开发路径可能重复的问题
- PHP开发中解决并发问题的几种实现方法分析
- JSP、AJax中文乱码问题解决,escape(), encodeURI(), encodeURIComponent(),js对参数连续两次调用 encodeURI(String) 方法
- android开发环境遇到adt无法启动的问题分析及解决方法
- Spring自带批量任务Scheduled重复执行两次的问题分析和解决
- 解决Spring和SpringMVC扫描注解类的冲突问题
- 前端开发学习之——利用模板实现涉及url问题时的bug分析及解决(chrome源码)