0

我有一个 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 覆盖。

4

1 回答 1

1

该行为是预期的,这是因为您有两个名称完全相同的 bean,而info稍后定义的一个(在 A 中)是在运行时创建的一个。该行为与使用 xml 定义的 bean 发生的行为相同。

最好通过了解 Spring 的内部结构来解释这是如何发生的,@Configuration这里的 Spring 文档对此进行了解释 - http://static.springsource.org/spring-framework/docs/3.2.3.RELEASE/spring-framework-reference/html /beans.html#beans-java-further-information-java-config。简而言之,即使您info()直接在 中调用方法AConfig,它实际上也不是在真实AConfig实例上调用该方法,而是在代理上调用,该代理具有确保返回正确 bean 实例的逻辑。

于 2013-06-17T20:26:39.120 回答