インターフェイスを実装せずに、パッケージ内のすべてのコンポーネントをAutowire

天然痘:

私は、サービスとリポジトリのトンとプロジェクトを得ました。現在、各リポジトリは、アノテーションを使用してサービスにautowiredされます。

@Service
public class Service1 {
    @Autowired
    private Repository1 repository1;

    @Autowired
    private Repository2 repository2;

    ...100+ more
}

これらのリポジトリのすべてが同じパッケージの下にあります。することが可能であるスキップリポジトリごとに宣言を?

簡単な解決策は、私はこのようなインターフェイスを実装するだろうが見つかりました:

@Autowired
private Map<String,RepositoryInterface> repositoryInterface

public void method1(){
    repositoryInterface.get("repository1").doMethod();
}

これは、良い解決策だったはずですが、問題は、私はすべてのソースコードへのアクセスを持っていないです。私はインターフェイスクラスを追加するために変更することはできませんだとリポジトリクラスのトンを持っています。

だから、これを解決するための別の方法は何ですか?ただのリポジトリにアクセスするために全体のパッケージだけ使用Bean名をスキャンような?

davidxxx:

豆は、そのクラスまたは自分の名前(両方)から取得可能です。
あなたのケースでは、文脈からそれらを取得するために、そのクラスに直接依存している可能性があります。

注入ApplicationContext(またはコンストラクターの方法):

@Autowired 
private ApplicationContext applicationContext;

そして、それを使用します。

applicationContext.getBean(RepositoryOne.class).doMethod1();

理想的にはそれが法に抽出する必要があります。

public <T> T getRepository(Class<T> clazz){ 
   return applicationContext.getBean(clazz);
}

より簡単に使用します:

getRepository(RepositoryOne.class).doMethod(1);

しかし、私はクラスの中で非常に多くのフィールドの依存関係を必要と警告します。
これはテストに/維持することが非常に困難になり、また、非常に使いがちエラー。
行うための最善のことは、このような複雑な/膨張クラスを避けるために、あなたのデザインを再考です。

以下のような構造を使用した以外にもprivate Map<String,RepositoryInterface> repositoryInterface、またはApplicationContextあなたが依存関係のチェックから利益を妨げることを起動時にSpringコンテナによって行わ失うことになりますNullPointerException矛盾に関連するとエラーがアプリケーションの作業中に(依存性が欠落しています)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231955&siteId=1