java - "merge"两个ApplicationContext配置的最佳方法

标签 java spring

场景如下:

我有一个用于基本 Web 应用程序的标准 applicationConfig.xml spring 配置。效果很好。我还有一个“核心 jar”用于不同应用程序的内部依赖项之一。 “核心 jar”有一个 AnnotationConfigApplicationContext ,它适本地注册不同的@Configuration bean。我正在尝试在使用 applicationConfig.xml 配置的应用程序中使用注释 @Configuration beans。

我可以设想两个我认为可行的选择:

  1. 重构 xml 配置以也使用annotationConfig 并将不同的配置注册到上下文,就像我们的“核心 jars”一样。

  2. 创建第二个上下文并直接访问它,而不是让单例/原型(prototype)与 xml 配置位于同一 applicationContext 上。我真的不想这样做,因为它看起来更像是一种黑客而不是一个优雅的解决方案(而且我不完全确定它会按照我想要的方式运行。)

  3. 我的梦想,但找不到任何文档来支持

我想以某种方式将注释配置 bean 注册到应用程序上下文中,但我无法让对象按照我希望的方式排列(也就是说,我的上下文不会 . register() @Configuration 文件 - 一次仅 1 个 bean....)

只是为了跟进 - 我成功了(YAY)。就我而言,我最终遵循了 gpeche 提出的一般模式。

applicationContext-parent.xml 包含 1 个 bean def:

<bean id="parentApplicationContext" class="org.springframework.context.annotation.AnnotationConfigApplicationContext" scope="singleton">
    <constructor-arg>
      <list>
        <value>com.package.CoreCommonInContainerConfigImpl</value>
        <value>com.package.CoreCommonCommonConfigImpl</value>
      </list>
    </constructor-arg>
</bean>

其中 CoreCommon****Impl 类是 @Configuration 注解的类,它们为该上下文定义 bean。

正如 gpeche 所指出的,@Autowired Bean bean; Controller 内部(例如)依赖于父上下文并自动解析。

谢谢!

最佳答案

我会做什么:

1) 在我的 WAR 中,放置一个额外的 Spring 上下文文件,例如 applicationContext-parent.xml

<beans ...>
    <bean id="parentApplicationContext" class="org.springframework.context.annotation.AnnotationConfigApplicationContext" scope="singleton">
    <!-- Any other configuration for your annotation-configured context -->
</beans>

2) 在我的 web.xml 中指定:

<!-- Where do I have my parent context? -->
<context-param>
    <param-name>locatorFactorySelector</param-name>
    <param-value>path/to/applicationContext-parent.xml</param-value>
</context-param>

<!-- How is my parent context called? -->
<context-param>
    <param-name>parentContextKey</param-name>
    <param-value>parentApplicationContext</param-value>
</context-param>

使用此配置,您将拥有父/子上下文,而不是“真正的”合并上下文,但您应该能够以通常的方式将父上下文中的 Bean 注入(inject)到子上下文 Bean 中,子上下文将回退尝试解析 bean 时到父上下文。

关于java - "merge"两个ApplicationContext配置的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188579/

相关文章:

java - IText 使用 XML Worker 防止跨多个页面的行中断

java - Android Google Maps API v2 中的用户位置标记

java - 什么是 Jdbc 类型 5 驱动程序

java - 以编程方式更改 JsonProperty (Access.WRITE_ONLY)

java - 如何使用 Spring 4.0.6 为 Hibernate 4.3.5.Final 全局设置 FlushMode?

java - 将分数转换为带分数 - Java 方法

java - 如何使用 jmockit 模拟 public void 方法?

java - 如果父 bean 定义为原型(prototype),子 bean 是否自动成为原型(prototype)

spring - 为 Oauth2 Spring Boot 创建自定义 OpenId 提供程序

spring - 在Docker上运行的Spring Cloud Netflix应用为什么被容器杀死了?