Spring ApplicationContext bean加载了两次

时间:2014-08-12 23:13:07

标签: java spring-mvc log4j

My Spring ApplicationContext文件正在加载两次。这是使用标准的maven webapp结构,带有一个web.xml。只有一个上下文文件,并且只定义了一个servlet。没有context-loader-listener。

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

  • 标准命名约定('test-servlet.xml')
  • 使用不同的Context文件定义ContextLoaderListener - 没有任何bean定义
  • 组件扫描
  • 手动Bean定义
  • Singleton 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 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 个答案:

答案 0 :(得分:1)

在我看来,Logger错误地(或者说,意外地)配置了<logger name="Test" additivity="false"> <level value="DEBUG" /> <appender-ref ref="console" /> </logger> 。您似乎有一个根记录器和一个额外的弹簧/自定义记录器,您没有将additivity标志设置为false(默认情况下为true)。在这种情况下,当您发送日志事件时,子记录器将记录该消息,然后将查找其父项并将其记录。

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

From the docs

  

Appender Additivity

     
      
  • 记录器C的日志语句的输出将转到C及其祖先中的所有appender。这就是这个词的意思   “appender additivity”。
  •   
  • 但是,如果记录器C的祖先,比如P,将additivity标志设置为false,则C的输出将被定向到所有   C中的追随者及其祖先,包括P而不是P   在P。
  • 的任何祖先中的追随者   
  • 记录器默认情况下将其可加性标志设置为true。
  •   

更改

{{1}}

类似于Spring记录器。