Sspring bean被初始化加载2次

Sspring bean被初始化加载2次

spring框架的web项目时,启动的时候发现某个bean被加载了两次,比如使用SchedulingConfigurer或者使用@PostConstruct的方法都被执行了2次

web.xml 配置

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/dispatcher-servlet.xml
</param-value>
</context-param> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

1、问题: ContextLoaderListener和DispatcherServlet,他们都可以引入spring,而且每个引入都会实例化一次bean。如果把两个引入方式配置到同一个文件,那么就会导致一个bean被实例化两次。
即:ContextLoaderListener加载了一次dispatcher-servlet.xml, 而DispatcherServlet又会默认加载/WEB-INF下面的<servlet-name>-servlet.xml配置文件。

2、处理方式:把ContextLoaderListener 注释掉,使其ContextLoaderListener和dispatcher-servlet不用重复加载同一个配置文件即可

3、使用ContextLoaderlistener和DispatcherServlet引入Spring的区别
1、ContextLoaderListener和DispatcherServlet都会生成一个WebApplicationContext(上下文),分别以不同的name存放在容器中。
2、同一个容器里,只允许有一个ContextLoaderListener但是可以用多个DispatcherServlet。 DispatcherServlet的context总是ContextLoaderListener的context的子类。
3、在获取bean的时候,会先从DispatcherServlet的context获取,如果没有再从ContextLoaderListener的context获取。
4.ContextLoaderListener是在web容器启动的时候启动的,默认会加载/WEB-INF/下面的applicationContext.xml文件,并创建一个WebApplicationContext容器。
5.ContextLoaderListener一般会加载整个Spring容器相关的bean配置管理(如: Log, Service, Dao, PropertiesLoader, DataSource Bean...)
6.DispatcherServlet是在第一次访问我们的应用的时候创建的。这时候它默认会将配置在/WEB-INF下面的<servlet-name>-servlet.xml配置文件,
7.DispatcherServlet一般会加载MVC相关的bean配置管理(如: ViewResolver, Controller, MultipartResolver, ExceptionHandler, RequestMapping...)

上一篇:网络编程socket、udp


下一篇:Mac 安装Bower