2010-07-12 38 views
0

當我啓動一個jetty中具有彈簧配置的webapp時,我看到有兩個初始化調用(@PostConstruct方法)。 web.xml聲明一個ContextLoaderListener並提供contextConfigLocation。jetty中彈簧豆的雙重初始化7.1.4

這看起來不對。 (春天3.0.3)。我有做過什麼嗎?

編輯

我的web.xml中召喚出兩個的DispatcherServlet和org.springframework.web.context.ContextLoaderListener。如果我刪除後,我停下看了兩眼初始化---但我的應用程序在碼頭,Maven的插件失敗,

No WebApplicationContext found: no ContextLoaderListener registered? 

編輯2

明白了。調度小服務程序將通過傳統名稱(* -servlet.xml)查找一些上下文文件,然後在contextConfigLocation中再次調用該文件導致它被加載兩次。

堆棧跟蹤1:

Segmenter.initialize() line: 63 
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 
Method.invoke(Object, Object...) line: 597 
InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(Object) line: 340  
InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(Object, String) line: 293  
CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor).postProcessBeforeInitialization(Object, String) line: 130 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsBeforeInitialization(Object, String) line: 394  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1405  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 519 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 456 
AbstractBeanFactory$1.getObject() line: 291 
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 222 
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 288  
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 190 
DefaultListableBeanFactory.preInstantiateSingletons() line: 574 
XmlWebApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 895 
XmlWebApplicationContext(AbstractApplicationContext).refresh() line: 425  
ContextLoaderListener(ContextLoader).createWebApplicationContext(ServletContext, ApplicationContext) line: 276 
ContextLoaderListener(ContextLoader).initWebApplicationContext(ServletContext) line: 197  
ContextLoaderListener.contextInitialized(ServletContextEvent) line: 47 
JettyWebAppContext(ContextHandler).startContext() line: 645 
JettyWebAppContext(ServletContextHandler).startContext() line: 200 
JettyWebAppContext(WebAppContext).startContext() line: 995 
JettyWebAppContext(ContextHandler).doStart() line: 588 
JettyWebAppContext(WebAppContext).doStart() line: 381 
JettyWebAppContext.doStart() line: 114 
JettyWebAppContext(AbstractLifeCycle).start() line: 55 
ContextHandlerCollection(HandlerCollection).doStart() line: 165 
ContextHandlerCollection.doStart() line: 162  
ContextHandlerCollection(AbstractLifeCycle).start() line: 55  
HandlerCollection.doStart() line: 165 
HandlerCollection(AbstractLifeCycle).start() line: 55 
JettyServer(HandlerWrapper).doStart() line: 92 
JettyServer(Server).doStart() line: 228 
JettyServer.doStart() line: 67 

堆棧跟蹤2:

Segmenter.initialize() line: 63 
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 
Method.invoke(Object, Object...) line: 597 
InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(Object) line: 340  
InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(Object, String) line: 293  
CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor).postProcessBeforeInitialization(Object, String) line: 130 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsBeforeInitialization(Object, String) line: 394  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1405  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 519 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 456 
AbstractBeanFactory$1.getObject() line: 291 
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 222 
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 288  
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 190 
DefaultListableBeanFactory.preInstantiateSingletons() line: 574 
XmlWebApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 895 
XmlWebApplicationContext(AbstractApplicationContext).refresh() line: 425  
DispatcherServlet(FrameworkServlet).createWebApplicationContext(ApplicationContext) line: 442 
DispatcherServlet(FrameworkServlet).createWebApplicationContext(WebApplicationContext) line: 458  
DispatcherServlet(FrameworkServlet).initWebApplicationContext() line: 339 
DispatcherServlet(FrameworkServlet).initServletBean() line: 306 
DispatcherServlet(HttpServletBean).init() line: 127 
DispatcherServlet(GenericServlet).init(ServletConfig) line: 241 
ServletHolder.initServlet() line: 421 
ServletHolder.doStart() line: 245 
ServletHolder(AbstractLifeCycle).start() line: 55 
ServletHandler(ServletHandler).initialize() line: 691 
JettyWebAppContext(ServletContextHandler).startContext() line: 204 
JettyWebAppContext(WebAppContext).startContext() line: 995 
JettyWebAppContext(ContextHandler).doStart() line: 588 
JettyWebAppContext(WebAppContext).doStart() line: 381 
JettyWebAppContext.doStart() line: 114 
JettyWebAppContext(AbstractLifeCycle).start() line: 55 
ContextHandlerCollection(HandlerCollection).doStart() line: 165 
ContextHandlerCollection.doStart() line: 162  
ContextHandlerCollection(AbstractLifeCycle).start() line: 55  
HandlerCollection.doStart() line: 165 
HandlerCollection(AbstractLifeCycle).start() line: 55 
JettyServer(HandlerWrapper).doStart() line: 92 
JettyServer(Server).doStart() line: 228 
JettyServer.doStart() line: 67 

回答

2

Actally,你有兩個Spring應用程序上下文:

  • 上下文從指定的XML文件通過ContextLoaderListener裝由context-param命名爲contextConfigLocation(或默認爲0)。
  • 上下文由DispatcherServlet從調度程序servlet的init-param指定的XML文件(默認爲contextConfigLocation(或<servletname>-servlet.xml))加載。

前者是後者的上下文。

所以,你不知何故在上下文中得到了同一個bean的定義(可能兩個contextConfigLocation都指向相同的XML文件)。

+0

一個有趣的想法...但沒有。被調用兩次的bean只有一個.xml文件。但是我確實有servlet和調度程序,這是錯誤的,不是嗎? – bmargulies 2010-07-12 19:59:21

+0

@bmargulies:請顯示'web.xml'。 – axtavt 2010-07-12 20:09:23

+0

Prob現在在編輯中描述。 contextConfigLocation包含用於安全的上下文文件以及文件名稱springapp-servlet.xml。調度員自動選擇了它,所以我最終加載了*兩次*。 – bmargulies 2010-07-12 20:17:42