2012-12-07 17 views
24

インスタンス化するBeanの順序を指定する方法はありますか?つまり、特定のBeanを他のBeanよりも先にインスタンス化したいと考えています。Spring 3 Beanのインスタンス化シーケンス

私はSpring 3.2とアノテーションベースの宣言方法を使用しています。

+0

私の実際には、インスタンス化シーケンスはxml構成ファイルの順序と同じです。しかし、例外があるかもしれません.. –

答えて

52

ビーン次いで順序を<property/>@Autowired又は<constructor-arg/>を定義することにより、豆Bに依存する場合はSpringコンテナによって強制的に固定されています。ここでは問題ありません。

しかし、あなたは明示的な依存関係を介して発現されていない豆作成の特定の順序を強制したい場合に使用して自由に感じる:

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

以上(注釈付き、@Bean Java構成でも動作します):

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

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

+5

+1のコードにおいの説明 – ElderMael

3

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

5

Tomaszによって提供された回答に同意します。豆Aが豆Bに依存していることを知っていれば、これは正しいアプローチです。

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

+0

私はこれを使用して、システムプロパティファイルからspring.active.profile設定を設定しました。よく働く! –

関連する問題