是的,这是可能的。原因如下:
仅仅是因为 Spring 能够扫描您的应用程序的类路径(如果您使用 java 注释,@ComponentScan('com') 将加载您在包 com.** 中的每个类)。
如果您只运行 JAR C 及其依赖项,并且例如加载特定包中的每个类,那么您会没事的,不会有任何意外。
A 和 B 一样。
但是,如果您使用 A、B 和 C,并且让 Spring 扫描您的包(例如 A 和 C 之间的一些常见包),那么您可以拥有由 A 声明的 bean 和由 B 声明的 bean。这可能会出现一些错误如果您认为您只有一个 Datasource 类型的 bean,那么您在 A 中有一个,在 C 中有一个。
这是一个例子:
A 有一个 DataSource。
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。 KO!
如果您部署的 WAR 也有 @ComponentScan("com.my"),则会发生这种情况。
所以是的,可以访问在 C 中定义在 A 中的 bean,但这可能就像隐藏的依赖关系,你的代码不清楚,执行是不确定的,并且可能在你不知道发生了什么的情况下像成功一样失败。
是不是更清楚了?