概述
1:SPRING容器与SPRINGMVC容器的区别与联系
参考:https://www.cnblogs.com/liujia1990/p/9024884.html
2:因同时使用spring和springMvc导致的ApplicationListener重复加载onApplicationEvent方法问题
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){...}
错误写法:
public class ApplicationContextListener implements
ApplicationListener<ContextRefreshedEvent> {
private static Logger log = LoggerFactory.getLogger
(ApplicationContextListener.class);
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){
// root application context
if(null == contextRefreshedEvent.getApplicationContext().getParent()) {
log.debug(">>>>> spring初始化完毕 <<<<<");
// spring初始化完毕后,通过反射调用所有使用BaseService注解的initMapper方法
Map<String, Object> baseServices =
contextRefreshedEvent.getApplicationContext().
getBeansWithAnnotation(BaseService.class);
for(Object service : baseServices.values()) {
log.debug(">>>>> {}.initMapper()", service.getClass().getName());
try {
Method initMapper = service.getClass().getMethod("initMapper");
initMapper.invoke(service);
} catch (Exception e) {
log.error("初始化BaseService的initMapper方法异常", e);
e.printStackTrace();
}
}
// 系统入口初始化,业余草:www.xttblog.com
Map<String, BaseInterface> baseInterfaceBeans =
contextRefreshedEvent.getApplicationContext().
getBeansOfType(BaseInterface.class);
for(Object service : baseInterfaceBeans.values()) {
_log.debug(">>>>> {}.init()", service.getClass().getName());
try {
Method init = service.getClass().getMethod("init");
init.invoke(service);
} catch (Exception e) {
_log.error("初始化BaseInterface的init方法异常", e);
e.printStackTrace();
}
}
}
}
}
实现ApplicationListener<ContextRefreshedEvent>接口进行操作,同时,
applicationontext和使用MVC之后的webApplicationontext会两次调用上面的方法,如何区分这个两种容器呢?
正确写法:
但是这个时候,会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器,即springmvc容器)。
这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理,修改后代码 :
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent() == null){//root application context 没有parent,他就是老大.
//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
}
}
上面是网上的大部分说法,但是,我在做项目时,我想着为啥不能进行非null值判断呢,那样的话就是projectName-servlet context容器进行管理了,也是可以的呀,后来我一想,原来我的问题实际上是Spring和SpringMVC父子 容器的问题,就看这个想要谁管理你的逻辑代码,就用哪个容器,非null判断的话(event.getApplicationContext().getParent() == null)代表springmvc容器,
event.getApplicationContext().getParent() == null)判断的话 代表spring容器
最后
以上就是搞怪画笔为你收集整理的SPRING容器与SPRINGMVC容器的区别与联系1:SPRING容器与SPRINGMVC容器的区别与联系2:因同时使用spring和springMvc导致的ApplicationListener重复加载onApplicationEvent方法问题的全部内容,希望文章能够帮你解决SPRING容器与SPRINGMVC容器的区别与联系1:SPRING容器与SPRINGMVC容器的区别与联系2:因同时使用spring和springMvc导致的ApplicationListener重复加载onApplicationEvent方法问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复