27

インスタンス化するBeanの順序を指定する方法はありますか?つまり、特定のBeanを他のBeanの前にインスタンス化する必要があります。これは、起動シーケンスのようなものです。

Spring3.2とアノテーションベースの宣言メソッドを使用しています。

4

4 に答える 4

56

Bean Aがを定義することによってBeanB依存している場合<property/>@Autowiredまたは<constructor-arg/>順序はSpringコンテナによって強制および固定されます。ここでは問題ありません。

ただし、明示的な依存関係を介して表現されないBean作成の特定の順序を強制したい場合は、以下を自由に使用してください。

<bean id="A" depends-on="B"/>
<bean id="B"/>

以上(アノテーション付き、@BeanJava構成でも機能):

@Service
@DependsOn("B")
public class A {}

またはさらに良い...それを使用しないでください。これらの構造はコードの臭いであり、多くの場合、コンポーネント間に厄介な目に見えない依存関係があることを示唆しています。

于 2012-12-07T20:29:06.543 に答える
7

Tomaszによって提供された答えに同意しました。BeanAがBeanBに依存していることがわかっている場合、これは正しいアプローチです。

すべてのBeanをインスタンス化する前に実行する必要のあるロジックがある場合があります。この場合、BeanFactoryPostProcessorを使用できます。Springは最初にBeanFactoryPostProcessorsを作成して実行し、その後は他のすべてのBeanのみを作成して実行します。同時に、BeanFactoryPostProcessorがBean Aに依存している場合は、プロパティまたはコンストラクターインジェクションを使用できます。この場合、Springは最初にBean Aを作成し、次にBeanFactoryPostProcessorを作成し、BeanFactoryPostProcessorを呼び出し、その後、コンテキスト内の他のすべてのBeanのみをインスタンス化します。

于 2013-11-23T14:00:53.473 に答える
3

BeanのOrderedインターフェースを使用して、他のBeanとの相対的な順序を定義できます。

于 2012-12-07T20:16:09.770 に答える
0

さらに、BeanFactoryPostProcessoremamedovが言ったように使用する場合、インスタンスシーケンスOrderedを制御するためにインターフェイスを実装できます。BeanFactoryPostProcessor

于 2018-10-19T03:11:28.693 に答える