Spring:如何在Bean B加载完成后初始化Bean A?

3

我有一个BeanA,它的构造函数需要BeanB。 一旦BeanB被实例化(并设置了其属性),我想调用BeanB.init()。

有没有办法做到这一点?

另一种方法是在上下文中所有bean都被创建后调用BeanB.init()。

谢谢!

2个回答

6
您可以在您的applicationContext.xml中使用init-method来指定初始化方法。如果您想让一个bean在另一个bean实例化后再实例化,您可以使用depends-on,即使在constructor-args中的任何ref元素(例如本例中)都会隐式地放置一个依赖项。
这将首先使用一个init方法初始化Bean B,然后在完成后将其用作A的构造函数参数。
<!-- Bean B -->
<bean id="beanB" 
    class="classB"
    init-method="init"
/>

<!-- Bean A -->
<bean id="beanA" 
    class="classA"
    init-method="anotherInit">
        <constructor-arg ref="beanB"/>
    </bean>

1
+1 不应该使用 depends-on,因为 BeanA 的构造函数将会接受一个 BeanB 的实例,因此 depends-on 是隐含的。然而,init-method 是正确的。 - John B
@JohnB 谢谢,已添加评论说明任何 ref 元素都会产生隐式依赖关系。 - Xavi López
所以,只有在B被实例化并注入所有属性后,A上的init方法才会被调用?太好了,这正是我需要的。谢谢 :) - Peet Denny

1

你可以让BeanB实现InitializingBean。但这样做的缺点是,你会在BeanB和Spring之间创建一个依赖关系,这并不是很好。

我认为更好的方法是在构造函数中注入所有依赖项,并从中调用init。这样,你就不需要将你的类与Spring绑定在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接