SpringMVC在启动完成后执行方法 - 执行多次的原因及解决方案
2017-05-19 09:33
218 查看
2017/5/19 9:34:22 使用markdown重新编辑,并引入新的参考链接。
2017/10/26 19:58:49 修改格式.
第一个版本发布于 2017-02-08 23:23
通过实现ApplicationListener来达到在spring容器加载完毕时来作出某些自定义的操作,关于这一点想必很多人都知道了,本篇文档当然不会是这类被很多前人讲述了一遍又一遍的东西。
今天所要讲的是在SpringMVC中在上面实现的方法会被Spring回调两次,如果你是因为这个问题而找到了这篇文章,那么恭喜你达到了终点,在下面的内容里我会给出解决方案和产生这种现象的原因。
Spring里获取bean的逻辑是:如果在自身的容器中没有找到该对象,那么就去parent container中查找(相关源码参见
而Spring中的事件通知逻辑如下: 先向自身的容器发起事件通知,如果本容器有parent container存在,则在parent container进行一次通知(相关源码参见
所以:
parent container(
由
child container(
Spring和SpringMVC父子容器关系初窥
2017/10/26 19:58:49 修改格式.
第一个版本发布于 2017-02-08 23:23
通过实现ApplicationListener来达到在spring容器加载完毕时来作出某些自定义的操作,关于这一点想必很多人都知道了,本篇文档当然不会是这类被很多前人讲述了一遍又一遍的东西。
今天所要讲的是在SpringMVC中在上面实现的方法会被Spring回调两次,如果你是因为这个问题而找到了这篇文章,那么恭喜你达到了终点,在下面的内容里我会给出解决方案和产生这种现象的原因。
解决方案
不要在spring.xml中注册上面那个实现了
ApplicationListener<ContextRefreshedEvent>接口的类,去
spring-mvc.xml中进行注册即可。
原因
我们一般会有spring.xml和
spring-mvc.xml两个文件, 针对这两个文件.
Spring里获取bean的逻辑是:如果在自身的容器中没有找到该对象,那么就去parent container中查找(相关源码参见
AbstractBeanFactory类中的
doGetBean方法–[
(parentBeanFactory != null && !containsBeanDefinition(beanName))])
而Spring中的事件通知逻辑如下: 先向自身的容器发起事件通知,如果本容器有parent container存在,则在parent container进行一次通知(相关源码参见
AbstractApplicationContext类中的
publishEvent方法)
所以:
parent container(
spring.xml作为配置文件)
由
ContextLoaderListener(
org.springframework.web.context.ContextLoaderListener)载入
child container(
spring-mvc.xml作为配置文件) – 由
DispatcherServlet(
org.springframework.web.servlet.DispatcherServlet)载入
参考链接
http://zhaoshijie.iteye.com/blog/1974682 – 只有解决办法,没有原因Spring和SpringMVC父子容器关系初窥
相关文章推荐
- IHttpModule.Init方法被执行多次的原因
- Tomcat启动真正完成后,执行方法
- React Native Android的启动白屏/闪屏的原因,解决方案,原理,使用方法
- Spring/SpringMVC在启动完成后执行方法
- python+selenium执行多个测试方法时,chrome浏览器打开多次原因
- IIS启动,就自动执行一个WCF服务方法的解决方案实现的疑问?
- Spring SpringMVC在启动完成后执行方法源码解析
- TOMCAT 启动完成后Spring 执行某个类的方法——多线程启动tomcat,spring装配
- Spring/SpringMVC在启动完成后执行方法
- tomcta启动时需要执行的方法--解决方案
- quartz 暂停后重新启动,在暂停时 被暂停后的任务,在启动后会补偿执行即 会连续多次调用job中的execute方法。
- spring项目启动完成后,自动执行一次某个特定方法。
- IHttpModule.Init方法被执行多次的原因
- 调用RadioGroup的check(id)方法,监听onCheckedChanged方法被执行多次;调用clearCheck(),onCheckedChanged方法仍被执行的原因和解决办法
- python+selenium执行多个测试方法时,chrome浏览器打开多次原因
- tomcta启动时需要执行的方法--解决方案
- Tomcat启动完成后再执行一个指定的方法 - 不影响Tomcat的启动时间
- android的application类中,onCreate()被执行多次的原因及解决方案
- web项目启动完成执行某个方法
- 当springMVC 容器初始化完成后执行某个方法