春豆变得困惑

时间:2013-06-17 19:46:39

标签: java spring java-ee spring-mvc

我有一个弹簧网络应用程序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方法。的java。

有人可以解释为什么会这样。

修改

在我的春季日志文件中,我看到了这一行:

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覆盖了,但不确定为什么会被春天覆盖。

1 个答案:

答案 0 :(得分:1)

行为是预期的,这是因为你有两个具有完全相同名称info的bean,后面定义的那个(在A中)是在运行时创建的bean。行为与使用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实例。