我有一个 Spring Web 应用程序 A 和一个库 B。B 有一个配置文件。在 App 中使用 B 库时,我正在创建新的 bean 而不是自动装配。但仍然看到在库中初始化的 bean 已经覆盖了我在 App 中所做的初始化。
这是一个虚拟配置文件,可以清楚地解释:
AConfig.java
public class AConfig{
@Bean
public Info info(){
Info i = new Info("A");
return i;
}
@Bean
public A a(){
A a = new A();
a.setInfo(info());
a.setB(b());
return A;
}
@Bean
public B b(){
B b = new B();
b.setInfo(info());
return b;
}
}
BConfig.java
public class BConfig(){
@Bean
public Info info(){
Info i = new Info("B);
}
@Bean
public B b(){
B b = new B();
b.setInfo(info());
return b;
}
}
Aconfig.java 和 BConfig.java 都有 info() 方法来生成 info bean。我在 A 项目中没有 BConfig.java 文件。我没有做任何自动装配。我期望在 projectA 中我必须看到信息 bean 有字符串 A,但我看到的是字符串 B。在创建 Bean A 时,如何调用 Bconfig.java 的方法 info() 而不是 Aconfig 中的 info 方法。爪哇。
有人可以解释为什么会这样。
编辑
在我的春季日志文件中,我看到了这一行:
Overriding bean definition for bean 'Info': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=AConfig; factoryMethodName=info; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/configs/AConfig.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=BConfig; factoryMethodName=info; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/configs/BConfig.class]]
感觉就像我在 AConfig 中初始化的 bean 被 BCOnfig.java 覆盖,但不确定为什么是 spring 覆盖。