2016-09-06 3 views
1

私のApplicationContextには、いくつかのBeanが同じスタイルで作成されています。だから私は、このbeanのそれぞれについてFactoryBeanを書く多くの公表されたコードを持っています。これらの豆は共通の基盤を持ち、特別なインターフェースをすべて実装しています。Springで型別にBeanを作成するには?

私はすべてのBean作成を1つの工場に移したいと思います。その一つがあり、私は私の特別な豆のいずれかを作成するために必要なすべてのインスタンス化を実装することができ、この

<T extends CommonInterface> T createInstance(Class<T> clazz); 

のようなMethodeのを提供しなければなりません。その方法で

私の実装は

@Autowired 
private MyCommonInterfaceImplementation impl; 

ためにスプリングによって呼び出されます

createInstance(MyCommonInterfaceImplementation.class) 

これまでのところ私は、両方のは、私が探してるではないと思われる、BeanFactoryFactoryBeanを見ました。

提案がありますか?あなたはもはやあなたのBeanクラスに注釈を付けるために持っていて、それらをcomponentscanを経由してインスタンス化することができましょう春4.3のとおり

+0

なぜあなたは '@ Component'アノテーションを使用していませんか? –

+0

@MartinFrey、この場合、コンポーネント注釈がどのように役立ちますか?私は完全に質問を理解しているかもしれませんが、このケースでは、このケースの注釈は解決策ではありません。 –

答えて

1

なぜ@bean

@Bean 
public MyCommonInterfaceImplementation getMyCommonInterfaceImplementation(){ 
    return MyBeanFactory.createInstance(MyCommonInterfaceImplementation.class); 
} 

//should autowire here 
@Autowired 
private MyCommonInterfaceImplementation impl; 
+0

これはFactoryBeanを毎回実装するよりはるかに優れています。しかし、私は30個のBeanについて何かを持っていて、30個のBeanメソッドがすべて同じことをしています。そのクラスでBeanを作成することは大きな助けになります。 – mibutec

0

を使用しません。

@Configuration @ComponentScan( value = "some.package.path", includeFilters = { @Filter(type = ASSIGNABLE_TYPE, value = { MyClass1.class, MyClass2.class, MyClass3.class }) })

これは、実際にそこに記載されている三つのクラスのための豆を作成します。この例はフィルタなしでも機能するはずです(パッケージ内のすべてがBeanになります)。これは、クラスがオートワイヤリングに使用できる単一のコンストラクタを持つ限り、機能します。特定のインタフェースのすべての実装をフィルタリングしてBeanを登録することはできないと思います。

これを実行するには、ContextListenerと入力します。リフレクションを使用して、どのクラスをインスタンス化してからcontext.autowire(..)を使用して、コンテキストからの依存関係を注入します。ちょっとハッキリですが、うまくいくかもしれません。まだコースのコンテキストで登録されたBeanを取得する方法の問題点を残し

@Override public void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext context = event.getApplicationContext(); MyClass bean = context .getAutowireCapableBeanFactory() .autowire(MyClass.class, Autowire.BY_NAME.value(), true); ... }

また、豆をプログラムで追加する方法については、this SO questionに回答することもできます。

1

基本的には、Beanの作成中に特別な処理が必要な場合にのみ、「工場」で@Bean注釈が必要です。

setter、fields、または1つのコンストラクタですべてが@Autowiredになり、初期化中にBeanで処理する必要がない場合は、インタフェースの実装ごとにアノテーション@Componentを宣言できます。これは、アプリケーション内でcomponent scanningがアクティブである限り動作します。その結果、各コンポーネントスプリングによって、使用できるBeanが作成されます。

私はモバイルでこれを書いていますので、コードを表示するのが最良ではありません。@ComponentScanのチュートリアルに従ってください。必要があれば教えてください。私はこの答えを補うことができます。

0

最後に、私が見つけた最良のアプローチはConfigurationClassPostProcessorです。一例として、私はhttps://github.com/rinoto/spring-auto-mock

を使用しました。しかし、それは何もないからBeanを作成するのは非常に複雑で、「あまりにも多くの魔法」であることから、我々は明示的に@Bean経由でこれらのBeanを作成することを決めました。

ご回答ありがとうございます。

関連する問題