我是靠谱客的博主 搞怪画笔,最近开发中收集的这篇文章主要介绍SPRING容器与SPRINGMVC容器的区别与联系1:SPRING容器与SPRINGMVC容器的区别与联系2:因同时使用spring和springMvc导致的ApplicationListener重复加载onApplicationEvent方法问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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方法问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部