多模块 Maven 项目中的应用程序上下文 - Spring

Application Context in multi module maven project - Spring

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

假设我有一个 WAR 应用程序 "App"。 App 有 Jars A、B 和 C。A 对 B 有 pom 依赖,C 对 B 有 pom 依赖。那么 A 中定义的 bean 是否可以在 C 中使用,因为它们被打包在 WAR 文件中并加载到运行 次。

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

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

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

如果你只是 运行 将你的 JAR C 与它的依赖关系连接起来,并且你正在加载每个 class 例如在一个特定的包中,那么你会没事的,你不会有任何惊喜。

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

但是如果你使用 A、B 和 C,并且你有 Spring 扫描你的包(例如 A 和 C 之间的一些公共包),那么你可以拥有由 A 声明的 beans 和由B. 如果您认为您只有一个类型为 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 个数据源 + 1 个 JdbcTemplate。好的 ! - A + B -> 1 个数据源 + 1 个 JdbcTemplate。好的 ! - A + C + B -> -> 2 个数据源 + 1 个 JdbcTemplate。 !

如果您部署的 WAR 也有一个 @ComponentScan("com.my"),就会发生这种情况。

所以是的,可以访问 C 中 A 中定义的 bean,但这可能就像隐藏的依赖关系,您的代码不清楚,执行不确定,并且可能像成功一样失败,而您不知道发生了什么上。

是不是更清楚了?