2016-10-09 1 views
2

設定なしでJavaを使用してリストを自動配線する方法はありますか?設定なしで春にリストをオートワイヤリングする

public abstract class A { 
    public abstract doStuff(); 
} 

public class B extends A { 
    @Override 
    public void doStuff() { 
     System.out.println("I'm B"); 
    } 
} 

public class C extends A { 
    @Override 
    public void doStuff() { 
     System.out.println("I'm C"); 
    } 
} 

そして、私はクラス

public class Aggregator { 
    @Autowired 
    private List<A> stuffDoers; 
    private void doAllStuff() { 
     for(A a:stuffDoers) { 
      a.doStuff(); 
     } 
    } 
} 

を持ってどのようにすることができます私はautowire XMLでリストを設定せずにAggregatorにAの実装の一部:

は、私は以下のクラスを持っていると言いますか?

編集:私は常にクラスのインスタンスではなく、種類で動作リスト

答えて

3

@Autowiredのメンバーを制御することができるようにする方法を探しています。 AB、およびCの3つのタイプを定義しましたが、インスタンスを作成していません。

autowireにするには、これらのインスタンスを作成し、Springに登録する必要があります。これは、XMLコンフィグレーションまたはJavaコンフィグレーションが入る場所です。基本的に、Spring登録インスタンスを作成するための短い形式です。だからあなたが指定できます。これは、あなたに3つの独立したインスタンス豆(いないリスト)を与える

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class ApplicationConfiguration { 

    @Bean 
    public B someA() { 
     return new B(); 
    } 

    @Bean 
    public C anotherA() { 
     return new C(); 
    } 

    @Bean 
    public B evenMoreA() { 
     return new B(); 
    } 
} 

。詳細については、Java-based container configurationを参照してください。

ここで、Springは、これらのパッケージ内のタイプAのすべてのBeanを検索し、Aggregatorクラスに3つのBeanをすべて正確に取り込みます。

注:これらのBeanは、同じファイルに存在する必要はありません。それらはあなたの@ComponentScanパッケージのどこにでも宣言できます。


コメントで尋ねられたように、これらのインスタンスの一部だけを持ちたい場合はどうすればよいですか?

あなたのリストに追加さ豆のみいくつかをしたい場合は、状況はより複雑です。除外された豆は、の異なるパッケージの別の@Configurationクラスに移動する必要があります。その新しいパッケージをSpringの@ComponentScanパッケージに追加しないでください。そうすれば、Springはリストに追加するBeanを見つけられません。私が知る限り、これが唯一の方法です。もちろん

、あなただけ単一のBeanをしたい場合は、その後、いつものように、あなたは@Qualifierを使用してそれをautowireとBean名を指定する必要があります。この場合、Aの変数のListは使用しないでください。

+0

これは設定なしで、Javaでのみ行う方法を尋ねました。 – aclokay

+0

@ user1050389ああ、十分なJavaConfigの例を追加します。 – metacubed

+0

あなたはそれが3つの独立した豆を提供し、リストではないと述べました。これは、これらの独立したBeanをリストとして自動実行できるのでしょうか?それ以外の場合は、質問には答えません。ありがとう! – aclokay

関連する問題