当前位置: 首页 > 知识库问答 >
问题:

spring ApplicationContext bean加载两次

公孙锋
2023-03-14

我的spring ApplicationContext文件正在加载两次。这是使用标准的maven webapp结构,只有一个web.xml。只有一个上下文文件,并且只定义了一个servlet。没有Context-Loader-Listener。

我尝试了以下方法来解决此问题

  • 标准命名约定('test-servlet.xml')
  • 使用不同的上下文文件定义ContextLoaderListener-不使用任何bean定义
  • 组件扫描
  • 手动Bean定义
  • 单例getInstance类型方法(“Public static Test getInstance()”)和私有构造函数

web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="testApp" version="2.5">

    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/beans.test.xml</param-value>
        </init-param>
    </servlet>
</web-app>

beans文件

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:annotation-driven />
    <bean id="testController" class="Test" />
</beans>

Java阶级

public class Test {
    private static Logger logger = Logger.getLogger(Test.class);
    public Test() {
        logger.debug("IN INIT");
    }
}

所有这些都将导致以下几行

2014-08-12 15:56:32,427 - INFO : [beans.factory.xml.XmlBeanDefinitionReader-loadBeanDefinitions] - Loading XML bean definitions from ServletContext resource [/WEB-INF/beans.test.xml]
2014-08-12 15:56:32,427 - INFO : [beans.factory.xml.XmlBeanDefinitionReader-loadBeanDefinitions] - Loading XML bean definitions from ServletContext resource [/WEB-INF/beans.test.xml]
2014-08-12 15:56:33,015 - DEBUG: [Test-<init>] - IN INIT
2014-08-12 15:56:33,015 - DEBUG: [Test-<init>] - IN INIT

到目前为止...似乎什么都不起作用。

编辑:

该应用程序使用Log4j(1.2.17版)和/src/main/resources下的Log4j.xml文件,结构如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

     <appender name="console" class="org.apache.log4j.ConsoleAppender">
         <param name="Target" value="System.out" />
         <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d - %-5p: [%c{4}-%M] - %m%n" />
         </layout>
     </appender>
     <logger name="org.springframework.beans.factory">
         <level value="INFO" />
         <appender-ref ref="console" />
     </logger>
     <logger name="Test">
         <level value="DEBUG" />
         <appender-ref ref="console" />
     </logger>
     <root>
         <level value="ERROR" />
         <appender-ref ref="console" />
     </root>
</log4j:configuration>

共有1个答案

韩晋
2023-03-14

在我看来,您的记录器配置不正确(或者说,意外地)。您似乎有一个根记录器和一个额外的spring/自定义记录器,其中您没有将additivity标志设置为false(默认情况下为true)。在这种情况下,当您发送日志事件时,子日志记录器将记录消息,然后它的父日志记录器也将被查找并记录。

将子项的可加性设置为false,以禁用任何父项也记录该事件。

从文件中

附加可加性

  • 记录器C的log语句的输出将转到C中的所有附加符及其祖先。这就是术语“附加可加性”的含义。
  • 但是,如果记录器C的一个祖先(例如P)将可加性标志设置为false,则C的输出将指向C中的所有附加符及其P之前(包括P)的祖先符,但不指向P的任何祖先符中的附加符。
  • 日志记录器的可加性标志默认设置为true。

改变

<logger name="Test" additivity="false">
     <level value="DEBUG" />
     <appender-ref ref="console" />
</logger>

spring伐木工也是如此。

 类似资料:
  • 问题内容: 我有一个加载从源文件编译的类。但是,当我更改源文件,保存并重新编译它时,仍然会加载该类的第一个版本。 我想念什么?像newInstance之类的东西? 问题答案: 类加载器不能替换已经加载的类。将返回现有实例的引用。 您必须实例化一个新的类加载器,并使用它来加载新类。然后,如果要“替换”该类,则必须扔掉该类加载器并创建另一个新的类加载器。 针对您的评论:做类似的事情 该类加载器将使用“

  • 问题内容: 我有一个带有Spring和Spring安全性的Web项目。我的web.xml: 在服务器日志中,我看到Spring上下文被加载了两次(Spring BeanDispatcherServletContextL。我该如何解决? 在本教程中,我看到如果提供了,则不需要。但是,如果我删除了初始化参数,则会出现错误:“ :无法打开资源 ”。Dispather Servlet在默认位置找到上下文配

  • 问题是,每次尝试筛选表时,我的 实现中被重写的方法 都会被调用两次。 我的<代码>LazyDataModel<代码>实现: 我的xhtml视图: 和控制器

  • 在我之前提到的活动的自定义回收器视图适配器中,我想在点击我的一个元素时对碎片进行充电,例如: 这是我的片段类: 这个片段还加载了一个google Maps片段,您可以在它的布局中看到: 当我在一个项目中第一次点击时,一切正常,但当我在另一个项目中第二次点击时,我会得到以下错误:

  • 问题内容: 有没有办法在同一个python会话中两次加载一个模块? 用一个例子填补这个问题:这是一个模块: 模版 现在,我想两次导入该模块,例如创建一个类的两个实例以实际具有的两个副本。 要已经回答评论中的问题,“如果有人只要创建一个带有变量的类,为什么有人会想这样做”: 您是正确的,但是存在大量的源,必须重写,并且两次加载一个模块将是一个快速修复^^。 问题答案: 是的,您可以两次加载一个模块:

  • 问题内容: 为了进行测试,我想从应用程序加载共享库的两个实例。库中的代码提供了API,但由于某些功能依赖于静态变量,因此它不允许我初始化库的两个(或多个)实例。 我目前正在为此lib编写单元测试,并且我想拥有两个实例,因为这将大大简化我的测试。 该库未链接到该程序。相反,我直接使用LoadLibrary / GetProcAddress(或linux上的dlopen / dlsym)加载它。为了区