Spring (MVC) 4.0.3, Java 1.7.0_71, кот 7.0.57, окна 7Почему получает пружинный боб инициализированному дважды
У меня есть приложение Spring MVC, с 2 applicationContexts, то applicationContextRoot загружается :
AbstractAnnotationConfigDispatcherServletInitializer: protected Class<?>[] getRootConfigClasses {
return new Class<?>[] { AppConfig.class }
}
Сайт WebApplicationContext загружен.
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] {WebMvcConfig.class};
}
Класс AppConfig содержит определение бина для Bean в фокусе (Dropwizard-х MetricRegistry
)
@Configuration
public class AppConfig {
...
@Bean
public MetricRegistry metricRegistry() {
MetricRegistry result = new MetricRegistry();
LOG.info("testing", new Exception("trace me"));
configureReporters(result);
return result;
}
Я вижу trace me stacktrace
под названием дважды. Типы стеков различны:
....zipped
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) [spring-context-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) [spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) [spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) [spring-web-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992) [catalina.jar:7.0.57]
> at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) [catalina.jar:7.0.57]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.57]
против (несколько мсек позже).
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) [spring-context-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658) [spring-webmvc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:530) [spring-webmvc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484) [spring-webmvc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) [spring-webmvc-4.0.3.RELEASE.jar:4.0.3.RELEASE]
> at javax.servlet.GenericServlet.init(GenericServlet.java:158) [servlet-api.jar:3.0.FR]
> at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) [catalina.jar:7.0.57]
> at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1090) [catalina.jar:7.0.57]
> at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5231) [catalina.jar:7.0.57]
> at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5518) [catalina.jar:7.0.57]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.57]
В первый раз компонент создается в web.context.ContextLoader
контексте, тогда как 2-й раз его создали в web.servlet.FrameworkServlet
web.xml пуст, кроме ограничений безопасности, инициализация выполняется через экземпляр AbstractAnnotationConfigDispatcherServletInitializer
Я не уверен в влиянии этого поведения, но это не то, что я ожидаю (beans - singleton и т. Д.). Также это поведение сохраняется, если я вывожу каждую аннотацию @autowired
этому компоненту. Я проверил, что есть только один @componentscan (в WebMvcConfig)
Это звучит, как вы компонент сканирования в 'WebMvcConfig', но не исключая' классы Configuration'. например '@ComponentScan (basePackages = {" mypackage "}, excludeFilters = @ ComponentScan.Filter (type = FilterType.ANNOTATION, value = Configuration.class))' – beerbajay
@beerbajay благодарит тонну! Если вы сделаете это, я награду его. –