Почему Spring компонентное сканирование находит файлы XML?

У меня есть приложение Jersey Spring. Я не могу понять, что заставляет его извлекать файл конфигурации Spring XML, который я не говорю ему использовать.

Вот мой applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <!--<import resource="classpath:com/lala/spring/settings.xml"/>-->

    <context:component-scan  base-package="com.lala.service,
                                        com.lala.bin"/>

</beans>

веб.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app
Feb 2, 2012 11:35:57 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Feb 2, 2012 11:35:57 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Thu Feb 02 11:35:57 EST 2012]; root of context hierarchy
Feb 2, 2012 11:35:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
Feb 2, 2012 11:35:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [com/syncwords/spring/settings.xml]
Feb 2, 2012 11:35:58 AM org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization
0.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>ServletAdaptor</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletAdaptor</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <session-config> <session-timeout> 30 </session-timeout> </session-config> </web-app>

settings.xml находится в /com/lala/spring/settings.xml Итак, какого черта Tomcat печатает это:

Feb 2, 2012 11:35:57 AM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Feb 2, 2012 11:35:57 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Thu Feb 02 11:35:57 EST 2012]; root of context hierarchy
Feb 2, 2012 11:35:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
Feb 2, 2012 11:35:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [com/syncwords/spring/settings.xml]
Feb 2, 2012 11:35:58 AM org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization

Если я раскомментирую фактический ‹import>, то я увижу «Загрузка XML...settings.xml» ДВАЖДЫ и получу предупреждения о том, что его bean-компоненты дважды инициализированы. Если я удаляю "component-scan" и вручную определяю некоторые bean-компоненты, то все в порядке.

Я использую Spring 3.1.0-RELEASE.


person Aleksandr Dubinsky    schedule 02.02.2012    source источник
comment
Не могли бы вы опубликовать файл web.xml -- у меня такое ощущение, что это запускает файл settings.xml.   -  person Ralph    schedule 02.02.2012
comment
Выглядит нормально, вы когда-нибудь пытались переименовать settings.xml во что-то другое? Может есть какая-то магия, которая загружает settings.xml по умолчанию, или где-то пропущена конфигурация.   -  person Ralph    schedule 02.02.2012
comment
Попробуйте выполнить текстовый поиск по всем файлам в вашем проекте, найдя строку settings.xml. Это может быть импортировано куда-то еще.   -  person Michael    schedule 02.02.2012
comment
Он перестал работать после того, как некоторые непоследовательные возни привели к ошибкам FileNotFound. Я переместил переименованный lala.settings.xml в src/main/resources (где он должен был быть все это время? как он работал раньше?). Все снова заработало... и lala.settings.xml все еще загружается!   -  person Aleksandr Dubinsky    schedule 02.02.2012


Ответы (1)


Это сводило с ума отладку, потому что Netbeans/Tomcat не очищает мозги должным образом между запусками. (Оказывается, вам нужно вручную удалить каталог Tomcat и выполнить Clean&Build.) Но виновником был тестовый класс, аннотированный с помощью @RunAs(SpringJUnit4ClassRunner.class) и @ContextConfiguration (у меня есть тестовые классы среди моих источников).

Я считаю это ошибкой в ​​Spring и зарегистрирую ее как таковую, потому что тестовые классы создают свои собственные контексты (через специальный класс-раннер) и не имеют места для сканирования компонентов.

person Aleksandr Dubinsky    schedule 02.02.2012