首页 > 解决方案 > 多模块Maven项目中的应用程序上下文 - Spring

问题描述

我很难理解应用程序上下文在多模块项目中是如何工作的。

假设我有一个 WAR 应用程序“应用程序”。应用程序有 Jar A、B 和 C。A 对 B 有 pom 依赖,C 对 B 有 pom 依赖。所以在 A 中定义的 bean 可以在 C 中使用,因为它们被打包在 WAR 文件中并在运行时加载。

A、B 和 C 的应用程序上下文文件被导入到 WAR 应用程序中。

标签: springmaven-2applicationcontext

解决方案


对的,这是可能的。原因如下:

仅仅因为 Spring 能够扫描您的应用程序的类路径(如果您使用 java 注释,@ComponentScan('com')将加载您在包中拥有的每个类com.**)。

如果您只运行 JAR C 及其依赖项,并且例如将每个类加载到特定包中,那么您会没事的,您不会有任何意外。

如果你做A和B也是一样的。

但是,如果您使用 A、B 和 C,并且让 Spring 扫描您的包(例如 A 和 C 之间的一些常见包),那么您可以拥有由 A 声明的 bean 和由 B 声明的 bean。如果您认为这可能会出错你只有一个类型Datasource的 bean,你有一个在 A 中,一个在 C 中。

这是一个例子:

A 有一个数据源。

package com.my.datasource;

@Configuration
public class MyConfigurationA() {
    @Bean
    public DataSource datasource() {
        //return new datasource...
    }
}

C 有一个数据源。

package com.my.datasource;

@Configuration
public class MyConfigurationC() {
    @Bean
    public DataSource datasource() {
        //return new datasource...
    }
}

B 声明了一个 JdbcTemplate :

package com.my.template;

@Configuration
public class MyConfigurationB() {
    @Bean
    public JdbcTemplate template(DataSource ds) {
        return new JdbcTemplate(ds);
    }
}

如果你运行: - C + B -> 1 DataSource + 1 JdbcTemplate。好的 !- A + B -> 1 个数据源 + 1 个 JdbcTemplate。好的 !- A + C + B -> -> 2 个数据源 + 1 个 JdbcTemplate。KO!

如果您部署的 WAR 也有@ComponentScan("com.my").

所以是的,可以访问在 C 中定义在 A 中的 bean,但这可能就像隐藏的依赖项,你的代码不清楚,执行是不确定的,并且在你不知道发生了什么的情况下可能会像成功一样失败。

是不是更清楚了?


推荐阅读