Spring имеет механизм, называемый SingletonBeanFactoryLocator
, который можно использовать в местах, таких как приложения EJB 2.0, для получения контекста фабрики / приложения компонента в тех местах, где нельзя использовать внедрение зависимостей. В существующем Spring ContextLoader
есть зацепка, которую вы уже используете, чтобы воспользоваться преимуществами этой функции, хотя ее сложно настроить.
Вам нужно будет разделить контексты вашего приложения на отношения родитель / ребенок. Родитель будет содержать объекты сервисного слоя, в то время как дочерний объект состоит из материала, специфичного для веб-слоя.
Затем вам нужно добавить пару параметров контекста в ваш web.xml (как вы делаете это для местоположения конфигурации), чтобы сказать ему инициализировать родителя:
<context-param>
<param-name>locatorFactorySelector</param-name>
<param-value>classpath:beanRefFactory.xml</param-value>
</context-param>
<context-param>
<param-name>parentContextKey</param-name>
<param-value>beanRefFactory</param-value>
</context-param>
locatorFactorySelector
- это ссылка на XML-файл, НО (это то, где я всегда путаюсь), это не будет указывать на XML, который определяет ваши сервисы. Это xml определения бина, который создает бин контекста приложения. Затем вы ссылаетесь на этот компонент с помощью атрибута parentContextKey
.
Так, например, beanRefFactory.xml будет содержать:
<beans>
<bean id="beanRefFactory"
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>service-context.xml</value>
</list>
</constructor-arg>
</bean>
</beans>
В объектах вашего домена без DIed вы можете получить доступ к контексту приложения с помощью этого кода:
BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator.getInstance(locatorFactorySelector);
BeanFactoryReference contextRef= locator.useBeanFactory(parentContextKey);
ApplicatonContext context = (ApplicationContext) contextRef.getFactory();
Вы можете найти больше информации о ContextSingletonBeanFactoryLocator
в этом блоге . Также есть хорошее описание использования этого подхода в главе о EJB в Разработка Java с Spring Framework .