2011-12-14 14 views
3

だが、私はこのような注釈付きBeanのプロパティのセッターを持っていると仮定しましょう:カスタマイズ@Autowired

public class Foo { 
    ... 
    @Autowired 
    public void setBar(Bar bar) { 
    ... 
} 

Springframeworkは、いつものように、一致Barプロパティを検索します。しかし、私はデフォルトのBean解決プロセスを横取りして、ちょっとした "魔法"を追加したいと思います。私はなかれラッパー豆のいくつかの種類を紹介し、このに解決するロジックを移動することができます知っているが、説明したように、私はリゾルバを使用して、より一般的な方法を好む

public interface SomeResolverInterface<T> { 
    public T resolve(Class<T> beanClass); 
} 

public class BarResolver implements SomeResolverInterface<Bar> { 

    @Override 
    public Bar resolve(Class<Bar> beanClass) { 
    if(someCondition) { 
     return someBean; 
    } else { 
     return anotherBean; 
    } 
    } 

    ... 

:私はこのようなリゾルバをご紹介したいと思いますFooを分解ロジックから完全に独立させる。

Springframeworkにはこのような方法がありますか?

答えて

4

起動時(自動配線)に追加のロジックを実行するだけで済みます。この問題は(最悪のに最高の)対処するには、いくつかの方法があります。

  • AOP - 悪いアイデアは、すべての呼び出しに

  • カスタムスコープを傍受することにより、実行時のオーバーヘッドを紹介 - 参照:Custom spring scopes?はまた、実行時に動作し、

  • @Profile - 2つの一致するbeanを定義し、アクティブなプロファイルに基づいて1つだけを有効にします。かなり清潔でのみ起動時のオーバーヘッド

  • @Configurationを紹介 - Javaで定義する豆は、彼らがどのように作成されるかを完全に制御を持っていることの余分な利点があります。


@Configuration 
public class Config { 

    @Autowired 
    private Bar someBean; 

    @Autowired 
    private Bar anotherBean; 

    @Bean 
    @Primary 
    public Bar primaryBean() { 
     if(someCondition) { 
      return someBean; 
     } else { 
      return anotherBean; 
     } 
     } 

} 

することができますようにこの場合、Barタイプの3つの豆:someBean,anotherBeanおよびprimaryBeanがあります。最初の2つは、@Beanを使用して構成することも、@Serviceを使用してコンポーネントをスキャンすることによって構成することもできます。しかし、自動配線を可能にするために最後のprimaryBean@Primaryとマークされています。この方法で他の2つより優先されます。

解決ロジックがきれいで、保守しやすく、読みやすいため、これは私の推奨する解決策です。 IMHOこれは、Javaベースの@Configurationが本当に輝く状況です。

+2

+1 @Configurationについては、他のすべては遠くに見える –

0

私はこれを試したことがないが、私はあなたが

AnnotationConfigUtils 

それとも

AutowiredAnnotationBeanPostProcessor 

を見て、それはあなたのロジックの単純な拡張/プラグイン可能することが可能かどうか確認を経て、あなたのロジックを差し込むで見ることができると思います

2

トマシュが提供する@Configurationオプション以外にも、簡単なFactoryBeanを使用できます。インターフェイスを実装して、ファクトリBeanを宣言してください。 getObject()メソッドでは、カスタムロジックを実行します。