如果一个 bean 是惰性初始化的,那么依赖 bean 是否不应该等到该 bean 被惰性创建后再自己创建?
是的。换句话说,在被请求和初始化option_B
之前不会被创建。setup_bean
如果option_B
首先请求,则将强制setup_bean
首先初始化。
文件说
但是,当延迟初始化的 bean 是未延迟初始化的单例 bean 的依赖项时,ApplicationContext 会在启动时创建延迟初始化的 bean,因为它必须满足单例的依赖项。
因此,这个 bean 声明
<bean id="foo" class="whatever"><property name="bar" ref="thingChosen"/></bean>
将强制初始化thingChosen
,在这种情况下是别名option_A
。
我无法重现您正在经历的事情(也不应该)。仔细检查你在做什么。也许另一个 bean 正在引用setup_bean
.
这是一个SSCCE
public class Test {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
System.out.println("context initialized");
context.getBean("shouldnot");
}
public static class MyClass {
public MyClass() {
System.out.println("myclass");
}
}
public static class SetupBean {
public SetupBean() {
System.out.println("setup");
}
}
public static class MyOtherClass {
private MyClass myClass;
public MyOtherClass() {
System.out.println("myotherclass");
}
public MyClass getMyClass() {
return myClass;
}
public void setMyClass(MyClass myClass) {
this.myClass = myClass;
}
}
}
和spring.xml
豆子
<bean id="myref" class="test.Test$MyClass" lazy-init="true"></bean>
<bean id="shouldnot" class="test.Test$MyClass" lazy-init="true" depends-on="setup_bean"></bean>
<bean class="test.Test$MyOtherClass" >
<property name="myClass" ref="myref"></property>
</bean>
<bean id="setup_bean" class="test.Test$SetupBean" lazy-init="true"></bean>
它打印(减去 Spring 日志)
myotherclass
myclass
context initialized
setup
myclass
换句话说,setup
仅在shouldnot
被请求时创建。