多模块 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,但这可能就像隐藏的依赖关系,您的代码不清楚,执行不确定,并且可能像成功一样失败,而您不知道发生了什么上。
是不是更清楚了?
我很难理解应用程序上下文在多模块项目中是如何工作的。
假设我有一个 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,但这可能就像隐藏的依赖关系,您的代码不清楚,执行不确定,并且可能像成功一样失败,而您不知道发生了什么上。
是不是更清楚了?