2 u011624903 u011624903 于 2017.12.25 17:01 提问

关于SpringMVC的ContextLoader类中的一个疑问 5C

我一直不太明白,在initWebApplicationContext方法的第一行,

 if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
            throw new IllegalStateException(
                    "Cannot initialize context because there is already a root application context present - " +
                    "check whether you have multiple ContextLoader* definitions in your web.xml!");
        }

请问各位大佬,难道servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) 何时不等于null呢??为什么要判断一下不等于null呢?服务刚启动的时候,还有不等于null的时候吗?之前学习servlet的时候并没有太认真学,还请各位大神帮忙解释一下,在此感谢

7个回答

u011624903
u011624903   2017.12.26 10:32

我已经知道答案了,spring3.0之前,启动的方式有两种ContextLoaderListener和ContextLoaderServlet,spring不知道是listener还是servlet,所以才判断一下,3.0之后,ContextLoaderServlet这个类被删除了,也就是说只有一个ContextLoaderListener了,但是他为了以后有可能在加上类似ContextLoaderServlet类,所以没有删掉这个if判断,但是对于现在来说,这个if判断,果然没有一点用途,因为它百分之百是null,spring不加新特性的话,它永远不会走if里的内容,这才是我想要的答案,你们这些人其实和我一样,对spring一知半解,但是不如我,因为我知道问,你们知道不懂装懂

qq_34701469
qq_34701469 恭喜你成功证明了你自己
24 天之前 回复
u011126065
u011126065   2017.12.25 17:07

没看它抛异常的翻译嘛。
不能初始化context,因为已经有一个root应用context存在。检查你的web.xml中是否有多个ContextLoader 定义 。

u011624903
u011624903 我已经知道答案了,spring3.0之前,启动的方式有两种ContextLoaderListener和ContextLoaderServlet,spring不知道是listener还是servlet,所以才判断一下,3.0之后,ContextLoaderServlet这个类被删除了,也就是说只有一个ContextLoaderListener了,但是他为了以后有可能在加上类似ContextLoaderServlet类,所以没有删掉这个if判断,但是对于现在来说,这个if判断,果然没有一点用途,因为它百分之百是null,spring不加新特性的话,它永远不会走if里的内容,这才是我想要的答案,你们这些人其实和我一样,对spring一知半解,但是不如我,因为我知道问,你们知道不懂装懂
24 天之前 回复
u011624903
u011624903 我自己亲自在web.xml里写了两个相同的listener-class,它绝对不会走第二次,你说的“加了几处初始化配置”,自己有亲自测试过吗?它真的会初始化多次吗??
24 天之前 回复
u011624903
u011624903 回复jasondyoung: 你敢不敢告诉我,如何启动第二次的?你是怎么做到的??就当老弟是对知识的渴望了行不??
24 天之前 回复
u011624903
u011624903 回复jasondyoung: 这个方法有且只能进来一次吧?不会出现你说的进来第二次,或者第N次的情况吧??
24 天之前 回复
u011126065
u011126065 回复jasondyoung: 它不判断,怎么知道你是第一次进来,还是第N次?
25 天之前 回复
u011126065
u011126065 回复史文天WildTurtle: 这翻译要一个字的跟你解释吗?它只想初始化一次,你加了几处初始化配置,它检查到你已经启动了一次,就不想再给你启动了,就报错。
25 天之前 回复
u011624903
u011624903 我的意思是怎么可能不是null的呢??是怎么造成不是null的,服务刚启动,它肯定是null啊,还判断一次干嘛啊???
25 天之前 回复
kun_tostudy
kun_tostudy   Rxr 2017.12.25 17:15
qq_34701469
qq_34701469   2017.12.25 17:16

这个就是编程的严谨性啊,要往一个容器里放东西,先要判断一下容器里有没有东西。
逻辑性严密,才不容易出错。

u011624903
u011624903 这个你说的就不对了,出现问题要找根本原因,如果出现你说的这种情况,我们要究其根源,在其根源限制是否为null,我不能说你的逻辑错误,但是我并不完全赞同你的想法,我们说个最简单的例子,mybatis的查询集合,很多人都会对结果进行一下判断,判断是否为null,包括sorna,也会提示判断一下,但是如果你去看源码,会看到mybatis,第一行源码就是new了一个ArrayList,如果查询不到结果,会直接返回这个ArrayList,也就是说,用mybatis查询集合的时候,对象永远不为null,我想表达的是:要在根源限制住这些严谨性的操作,而不是在沿途的代码中,我问的这个问题已经有答案了,我在下面楼层已经自己回答了,祝我们大家共同进步
24 天之前 回复
qq_34701469
qq_34701469 回复史文天WildTurtle: 你在项目里,当接收到一个对象,后面需要进行一些业务处理的时候,为了防止空指针异常,通常都是会判断一下。我觉得可能就是这样习惯性的动作进行非空判断吧。
24 天之前 回复
u011624903
u011624903 大哥,它明明一定是null,(下边的评论多写了一个字)为啥要多写代码判断一下呢??而且我刚才测试了一下,在web.xml里,写两个相同的监听配置,它只走一次,绝对不会走第二次,就是说初始化监听器方法contextInitialized只会走一次,根本就不会走第二次,既然不会走第二次,干嘛要判断一下是否为null
24 天之前 回复
u011624903
u011624903 如果按照你的说法,逻辑严密行,那我定义一个String a=“aa”,然后我下一步是不是要判断一下a是否==null??我是不是逻辑更严密?
24 天之前 回复
u011624903
u011624903 回复杨_5426: 大哥,它明明一定不是null,为啥要多写代码判断一下呢??而且我刚才测试了一下,在web.xml里,写两个相同的监听配置,它只走一次,绝对不会走第二次,就是说初始化监听器方法contextInitialized只会走一次,根本就不会走第二次,既然不会走第二次,干嘛要判断一下是否为null
24 天之前 回复
qq_34701469
qq_34701469 回复史文天WildTurtle: 你咋非想的这么奇怪呢~0~ ,就是一个简单的非空判断嘛~~
24 天之前 回复
u011624903
u011624903 这个方法有且只能进来一次吧?不会出现你说的进来第二次,或者第N次的情况吧??如果这个方法真的只能进来一次,那么它进来之前,肯定是null,无需判断,而且以后再也不会再次进入这个方法
24 天之前 回复
Ro_bot
Ro_bot   2017.12.25 17:26

了解下 Java 的类加载机制就可以知道了.
他这是确保 WebApplicationContext 已被初始化.

u011624903
u011624903 这个方法有且只能进来一次吧?不会出现你说的进来第二次,或者第N次的情况吧??如果这个方法真的只能进来一次,那么它进来之前,肯定是null,无需判断,而且以后再也不会再次进入这个方法
24 天之前 回复
account090909
account090909   2017.12.25 21:09

健壮性的体现,防止瞎狗乱写

u011624903
u011624903 这个方法有且只能进来一次吧?不会出现你说的进来第二次,或者第N次的情况吧??如果这个方法真的只能进来一次,那么它进来之前,肯定是null,无需判断,而且以后再也不会再次进入这个方法
24 天之前 回复
dcxy0
dcxy0   Ds   Rxr 2017.12.25 23:18

由于已经存在根应用程序上下文,因此无法初始化上下文

检查你的web.xml中是否有多个ContextLoader 定义

翻译

u011624903
u011624903 这个方法有且只能进来一次吧?不会出现你说的进来第二次,或者第N次的情况吧??如果这个方法真的只能进来一次,那么它进来之前,肯定是null,无需判断,而且以后再也不会再次进入这个方法
24 天之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!