不知道怎么回事,在启动tomcat时发现了一个诡异的现象,一个用来加载资源全局配置的Component在tomcat启动的时候加载了两次:
具体情况是这样的
我创建了一个Env的Component,希望项目在运行时加载一些全局的配置,比如开发测试环境区分,以及一些资源的初始化,但是在启动时,通过日志发现以下问题
Env类被初始化了两次,什么原因呢?
刚开始,带着疑问在网上去寻找答案,说是tomcat下的server.xml配置问题,后来我改成如下配置
按照网上给的答案,通过加deployIgnore,改appBase等,我什么方法都试了,还是不行,这会儿我在想是不是我spring配置的问题,于是,终于找到了真相
这里有两个配置spring文件,app-root对应的就是applicationContext.xml,app-servlet对应的就是spring-mvc
先来看看我们错误的写法:
在app-root我们是这样写的
在app-servlet中,我们是这样写的
ok,在网上找了乱七八糟的一堆资料后,确认正确的写法如下:
在app-servlet中应该这样写:
第一,添加use-default-filters="false",取消使用默认的过滤规则
第二,因为在app-root中我们过滤掉了controller的加载,所以我们需要在此处加上对controller的处理
问题到这里已经解决了,接下来我们分析一下问题出现的原因:
在app-root中我们过滤掉了controller的加载,但是没有限制Server,Component,Repository的加载,所以当程序执行到app-servlet的时候,因为use-default-filters默认为true,即没有过滤规则,便会重复加载Server,Component,Repository,到这里我们就算是找到了问题的根源了
首先通过exclude-filter 进行黑名单过滤;
然后通过include-filter 进行白名单过滤;
将use-default-filters设置为false,我们自行设置过滤规则,这样就避免了重复加载