При использовании SpringBeanAutowiringInterceptor
не должен ли он получить ApplicationContext
вместо создания нового?
Да, и это фактически то, что он делает.Он использует механизм ContextSingletonBeanFactoryLocator
, который, в свою очередь, управляет несколькими экземплярами ApplicationContext
как статическими одиночками (да, даже Spring иногда вынужден прибегать к статическим одиночкам).Эти контексты определены в beanRefContext.xml
.
Ваша путаница, похоже, связана с ожиданием того, что эти контексты имеют какое-либо отношение к ApplicationContext
вашего веб-приложения - они не имеют, они полностью отделены.Таким образом, ContextLoader
вашего веб-приложения создает и управляет контекстом на основе определений bean-компонентов в app-config.xml
, а ContextSingletonBeanFactoryLocator
создает другой.Они не будут общаться, если вы не скажете им.EJB не могут овладеть контекстом веб-приложения, так как EJB находятся вне этой области.
Что вам нужно сделать, это переместить компоненты, которые должны использоваться вашими EJB, из app-config.xml
в другоефайл определения бина.Этот извлеченный набор определений bean-компонентов сформирует основу для нового ApplicationContext
, к которому (a) будут обращаться EJB-компоненты, и (b) будет действовать как родительский контекст контекста вашего веб-приложения.
В порядкечтобы активировать родительско-дочернюю ссылку между контекстом вашего веб-приложения и новым контекстом, вам нужно добавить дополнительный <context-param>
к вашему web.xml
, называемому parentContextKey
.Значением этого параметра должно быть имя контекста, определенного в beanRefContext.xml
(т.е. context
, в вашем примере).
Бины, которые остаются в контексте веб-приложения, смогут ссылаться на биныв родительском контексте, как и EJB.Однако EJB-компоненты не смогут ссылаться на что-либо в контексте веб-приложения.
Кроме того, вы не можете использовать XmlWebApplicationContext
в beanRefContext.xml
, поскольку этот класс требует осведомленности о веб-приложении, а ContextSingletonBeanFactoryLocator
не может предоставитьэто осознание.Вы должны придерживаться ClassPathXmlApplicationContext
там.