1

在演讲之前,我认为这个问题基本上可以归结为:

如何@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 模块引用,因为对代码没有编译时间依赖性。(叹气)到目前为止,模块化被证明是麻烦多于它的价值......

4

1 回答 1

1

在我的示例中,在“Web”模块的配置类中指定以下内容时有效:

@Configuration
@ComponentScan(basePackages={"com.acme.configuration"})
public class RootConfig {}

事实上,这就是@M。Deinum 在对这个问题的评论中说要做。在这个例子中,所有com.acme.configuration的包,不管它们是否在另一个 Maven 模块中,都将被正确地拾取和处理。然后,按照惯例,有必要将其他模块的所有配置类放在com.acme.configuration. 使用这种方法,不需要任何 XML 配置文件来“引导”配置,就像我试图做的那样。

于 2014-06-27T09:36:45.213 回答