おそらくService Locator Pattern
のようなものが必要だと思います。特定の要求に応じて、どのオブジェクトを使用するかを決定するのに役立ちます。あなたのサービスにアクセスしたいときに定型コードを減らします。
は、まず、あなたのvendor/owner/health
クラスにアクセサメソッドを持つinterface
を作成する必要があります。
public interface DetailsProvider {
Vendor getVendor();
Owner getOwner();
Health getHealth();
}
あなたDogDetailsProvider
、CatDetailsProvider
、ElephantDetailsProvider
そのDetailsProvider
インタフェースを実装する必要があります。また、vendor/owner/health
クラスには、継承メカニズムを維持するためのインタフェースが必要です。
次にあなたがサービスロケータを作成する必要があります。
@Service
public class DetailsProviderLocator {
private DetailsProvider dogDetailsProvider;
private DetailsProvider catDetailsProvider;
private DetailsProvider elephantDetailsProvider;
@Autowired
public DetailsProviderLocator(
@Qualifier("DogDetailsProvider") DetailsProvider dogDetailsProvider,
@Qualifier("CatDetailsProvider") DetailsProvider catDetailsProvider,
@Qualifier("ElephantDetailsProvider") DetailsProvider elephantDetailsProvider) {
this.dogDetailsProvider = dogDetailsProvider;
this.catDetailsProvider = catDetailsProvider;
this.elephantDetailsProvider = elephantDetailsProvider;
}
DetailsProvider getDetailsProvider(Animal animal) {
switch(animal) {
case CAT : return catDetailsProvider;
case DOG : return dogDetailsProvider;
case ELEPHANT : return elephantDetailsProvider;
default : throw new IllegalArgumentException("Not allowed!");
}
}
}
public enum Animal {
CAT, DOG, ELEPHANT;
}
は今列挙型に応じて、あなたのサービスロケータは、特定のサービスを返します(、何もすることができますこれはあなたの要求に依存します)。継承のために新しいサービスを作成し、新しい値をenumに追加するだけで、拡張も簡単です。
詳細な回答ありがとうございます。私はdogdetailsproviderなどのクラスにも修飾子を入れなければなりませんか? – fiddle
このコードを実行するためのサンプル呼び出しを追加できます – fiddle
修飾子を追加する必要があります。これは、 'DetailsProvider'型の複数のBeanを持つためです。 – ByeBye