別のプロジェクトでGrails内で行う最良の方法がわからないという状況に遭遇しました。これを設定するには、これがプレーンなSpringプロジェクトでやっていることです。共有インターフェースから継承した複数のSpring Beanをサービス内の配列に挿入する
私は2つの同じインタフェースから継承するクラスがあります。
public interface BaseInterface {
void doSomething();
}
public class Impl1 implements BaseInterface {
public void doSomething(){
System.out.println("doing impl 1");
}
}
public class Impl2 implements BaseInterface {
public void doSomething(){
System.out.println("doing impl 2");
}
}
これまでのところ、かなりの標準を、私は私が仕事をするために順番に呼び出したいN豆を持っています。 (この例は明らかに自明である)。別のJavaクラスでは、配列として注入されたすべてのBean(autowired)を取得するためにいくつかの魔法を実行できます。
@Autowired(required=false)
private BaseInterface[] theWorkers;
これは、コンフィグレーションでBeanコンテナに追加した限り、私にワーカーBeanの配列を与えます。
私はGrailsで同じことをしようとしています。同じ数式は機能しません。 @Autowired部分をサービスに入れ、resources.groovy内にImpl1とImpl2を作成することは、その仕事をしていないようです。だから私は最高の解決策が何であるか疑問に思っています:
1)私はこの作業を非常に簡単にする簡単なものがありません。
2)ダフィモhereで提案されているものに類似したものを実行します。私は、カスタムファクトリを使ったresources.groovyに名前付きのBeanを作成します。そのファクトリは、特定のインタフェースを実装しているすべてのクラスを含むクラスを生成します。私は、そのサービスを持っているサービス/クラスを引っ張るための提案に似た何かを使用して、そのサービスが他の人がそれを処理するためのサブクラスを反復できるようにします。
3)resources.groovy内のそれぞれのImplクラスの名前付きBeanを作成し、それぞれの固有の名前を使用して、すべてをクラスに個別に注入します。このオプションは実際には拡張されず、多くのダイナミズムを与えませんが、機能します。
私が考えていたクールな1つの方法は、2つの実装Beanを別の単純なBeanにラッピングすることでした。 BaseInterfaceManagerは実装(または実装されている実装の数)を認識していないため、このソリューションの方がはるかに優れています。ですから、resources.groovyだけが更新する必要があります。これはまさに私が目指しているものです。 Grailsコミュニティに追加してくれてありがとう、本当に素晴らしいです。 – Scott