• 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...)

  • 相关阅读:
    [记录]Eclipse版本选择和安装
    Nexus+Maven安装配置手册
    Eclipse编写Java程序
    Tomcat下载和配置
    SQL Server如何清除连接过的服务器名称历史?
    为文本添加全选Ctrl + A 功能
    配置Eclipse使用TFS源码管理
    [jQuery] jSrcollable
    [ios] cocos2d/cocos2dx 演示
    [c++] 实现类似printf这样的函数
  • 原文地址:https://www.cnblogs.com/brant/p/9412194.html
Copyright © 2020-2023  润新知