1. ホーム
  2. java

[解決済み] オートワイヤーリファレンスビーンズのタイプ別リスト

2023-05-29 13:51:33

質問

のオブジェクトのリストを持つクラスがあります。 Daemon 型のオブジェクトのリストを持っています。

class Xyz {    
    List<Daemon> daemons;
}

私のspringの設定はこんな感じです。

<bean id="xyz" class="package1.Xyz">
   <property name="daemons" ref="daemonsList">
</bean>

<bean id="daemon1" class="package1.DaemonImpl1"/>
<bean id="daemon2" class="package1.DaemonImpl2"/>

<bean id="daemonsList" class="java.util.ArrayList">
        <constructor-arg>
            <list>
                <ref bean="daemon1" />      
                <ref bean="daemon2" />
            </list>
        </constructor-arg>
</bean>

現在、各デーモン実装をリストで明示的に配線する代わりに、すべてのビーンタイプの Daemon タイプのすべてのビーンをリストに自動的に配線することは可能でしょうか。私が解決しようとしている問題は、もし誰かが Daemon クラスの新しい実装のビーンを作成し、それをリストに配線するのを忘れた場合です。

私はこの質問をstackoverflowのどこかで見たことがありますが、再びそれを見つけることができません。それをお詫びします。

どのように解決するのですか?

このように動作するはずです(XMLからArrayList Beanを削除してください)。

public Class Xyz {    

    private List<Daemon> daemons;

    @Autowired
    public void setDaemons(List<Daemon> daemons){
        this.daemons = daemons;
    }

}

XMLでこれをやる方法はないと思うのですが。


ご覧ください。 3.9.2. @Autowired@Inject :

アプリケーションコンテキストから特定のタイプのすべてのビーンを提供することも可能です。 アノテーションを追加することで、ApplicationContextから特定のタイプのすべてのビーンを提供することも可能です。 にアノテーションを追加することで、ApplicationContextから特定のタイプのすべてのビーンを提供することも可能です。

public class MovieRecommender {

  @Autowired
  private MovieCatalog[] movieCatalogs;

  // ...
}

<ブロッククオート

型付きコレクションも同様です。

public class MovieRecommender {

  private Set<MovieCatalog> movieCatalogs;

  @Autowired
  // or if you don't want a setter, annotate the field
  public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
      this.movieCatalogs = movieCatalogs;
  }

  // ...
}

ちなみに、Spring 4.xの時点では を使うと、これらのリストを自動的に並べることができます。 @Ordered という機構を使うことで、自動的に並び替えができるようになりました。 .