将messageSource移至applicationContext会导致默认messageSource在dispatcher-servlet上下文中不可见


问题内容

我有一个webapp,其中dispatcher-servlet在web.xml中定义了基本上下文,并加载了applicationContext

我已经messageSource定义好dispatcher-servlet并且正在将它注入到控制器中。

我还定义了我的服务applicationContext,可以将它们注入到我的控制器中(在dispatcher-servlet上下文中定义)。

但是,当我将for messageSource的定义移至,applicationContext以便某些服务可以解析消息时,dispatcher- servlet上下文显示该上下文未找到messageSourceBean,并且正在使用默认值,因此控制器会注入错误的Bean。

知道为什么messageSource定义applicationContextdispatcher-servlet上下文不可见吗?


我看到我的messageSource bean已装入applicationContext日志部分:

2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Creating shared instance of singleton bean 'messageSource'
2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Creating instance of bean 'messageSource'
...
2082 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Using MessageSource [mycommons.spring.ResourceBundleMessageSourceWithDefaultResolution: basenames=[messages]]

我在加载中看到此日志dispatcher-servlet

3858 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@55611ed3]

问题答案:

这就是它的工作方式。所述messageSource必须 在它被使用的上下文中定义。从父级上下文到子级将不会“继承”它。

这有点回溯到Spring 1.x的早期,并且此后从未真正改变过。

必须直接驻留在servlet appcontext中的许多“魔术豆”就是其中之一。