在演讲之前,我认为这个问题基本上可以归结为:
如何@Configuration
从应用程序的基于 XML 的配置中正确实例化 bean?
为了使我的项目模块化并遵循一些干净的架构,我创建了一个由三个模块组成的 Maven项目。有一个“web”模块、一个“interface”模块和一个“core”模块,web 和 core 都使用 Spring 基于 Java 的配置。
Web 模块在其 POM 中声明了对核心模块的运行时依赖和对接口模块的编译时依赖。核心模块是接口模块的实现,后者仅由 Java 接口和 DTO 组成。(这是对接口模块的编程尝试。)
当我启动 web 模块时,我希望核心模块中的所有 Spring 管理的 bean 都为 web 模块的应用程序上下文所知。通过在核心模块中创建一个如下所示的 XML 文件,我在“XML 方式”方面取得了一些成功:
// This xml snippet is part of the "core" module
<beans>
<context:annotation-config />
<context:component-scan base-package="com.acme.core"/>
</beans>
...并在Web模块配置中引用它,如下所示:
// The configuration of the "web" module
@Configuration
@ImportResource("classpath*:come/acme/configuration/spring/*.xml")
public class RootConfig {}
它可以工作,但我对解决方案不满意,因为我希望核心模块的所有配置都以 Java 方式完成。
因此,为此,我注意到Spring 说可以执行以下操作:
...
@Configuration
类可以在 Spring XML 文件中声明为普通定义:
<beans>
<context:annotation-config/>
<bean class="com.acme.configuration.spring.CoreConfig"/>
</beans>
如果它有效,那将(几乎)是理想的,因为核心模块中的 XML 文件将非常精简,并且基本上只是在CoreConfig
. 但是它对我不起作用,并且 web 模块找不到核心模块中定义的任何 bean。我认为这可能是因为如果bean 被实例化,那么它们是在不同的应用程序上下文中完成的,或者可能是因为CoreConfig
标记为@Configuration
,是特殊的,并且以这种方式从 XML 文件实例化它不会触发其他 bean 的创建它定义。
顺便说一句,我宁愿有一种方法可以在没有任何 XML 配置的情况下执行此操作,但com.acme.configuration.spring.AppConfig
无法直接从 Web 模块引用,因为对代码没有编译时间依赖性。(叹气)到目前为止,模块化被证明是麻烦多于它的价值......