O @Qualifier
ek açıklamanın amacı kullanmak değil. Ancak, bazı nedenlerle böyle veya benzer bir işleve ihtiyaç duyduğunuz için, bir geçici çözüm öneririm.
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD,
ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Wanted {
}
ve
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD,
ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotWanted {
}
bu yeni ek açıklamalarla Fasulye sınıfları ek açıklama:
@Wanted
ve @NotWanted
ek açıklama oluşturun
@Component
@NotWanted
public class NotWantedService implements Service {}
ve
Böyle
ApplicationContext applicationContext;
private <T> Collection<T> getBeansByTypeAndAnnotation(Class<T> clazz, Class<? extends Annotation> annotationType){
Map<String, T> typedBeans = applicationContext.getBeansOfType(clazz);
Map<String, Object> annotatedBeans = applicationContext.getBeansWithAnnotation(annotationType);
typedBeans.keySet().retainAll(annotatedBeans.keySet());
return typedBeans.values();
}
private <T> Optional<T> getBeanByTypeAndAnnotation(Class<T> clazz, Class<? extends Annotation> annotationType) {
Collection<T> beans = getBeansByTypeAndAnnotation(clazz, annotationType);
return beans.stream().findFirst();
}
Ve şimdi açıklama ile fasulye ya da bir fasulye almak için onları kullanabilir ve yazın::
@Component
@Wanted
public class WantedService implements Service {}
Eğer ApplicationContext
erişimi nereye Sonra yere 2 yöntemlerini eklemek gerekir
Collection<Service> services = getBeansByTypeAndAnnotation(Service.class, Wanted.class);
veya
Service service = getBeanByTypeAndAnnotation(Service.class, Wanted.class);
Muhtemelen o b değil problemle başa çıkmak için bir yol. Biz 'kutunun dışında' eleme ve türe göre ApplicationContext
den fasulye alamıyorsanız beri Ama, bu bunu yapmak için yollarından biridir.
Neden, '("Wanted"), yani' ctx.getBean adı sabiti kullanıyorsanız beri adıyla fasulye almıyor? Size Say @aux – aux
Eğer 'ctx.getBean ("servis1") do 50 yerler var' ve artık 'ctx.getBean ("Service2")' bunu değiştirmek istiyorum. Bu 50 değişiklik. eleme değiştirme 2 fasulye tanımları ('service1' ve' service2') Sadece dönmek için kullanılır. Başka durumlar da var - "Aranıyor" olan birden çok "Hizmet" örneğini almak istiyorum. Hepsi aynı fasulye ismine sahip olamaz. –
Tamam, anlıyorum. O zaman ne yay veri kalanında 'Repositories' gibi fasulye başvurular tutan ve farklı parametreler tarafından arama için kullanılan kendi "kayıt" fasulye, tanıtılması konusunda? Ya da bir sarıcı mı? – aux