Giriş
Açıklaması şöyle
While @Qualifier is helpful, using string identifiers can be error-prone. To avoid this, custom qualifiers come into play. These are annotations you create, annotated with @Qualifier. This gives you the advantage of compile-time checking, thereby reducing the possibility of errors.
Örnek
Elimizde iki tane anotasyon olsun. Burada SportsVehicle ve LuxuryVehicle diye iki tane custom annotation tanımlanıyor.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
public @interface SportsVehicle {
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
public @interface LuxuryVehicle {
}
Şöyle yaparız. Daha sonra her bean bunlardan hangisini kullanacaksa onunla işaretleniyor. @Autowired ile de hangi bean tipini istediğimizi belirtiyoruz
@Component
@SportsVehicle
public class Bike implements Vehicle {
// …
}
@Component
@LuxuryVehicle
public class Car implements Vehicle {
// …
}
@Autowired
@SportsVehicle
private Vehicle vehicle;
@Autowired
@LuxuryVehicle
private Vehicle vehicle;
Elimizde kendi anotasyonumuz olsun. Bu anotasyonda @Qualifier kullanılıyor.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Foo {
}
Bu anotasyonu kullanan bir metodumuz olsun.@Foo
public IFooService service1() { return new SpecialFooServiceImpl(); }
Ya da bu anotasyonu direkt bean üzerinde kullanalım.@Foo
@Component
public class EvenMoreSpecialFooServiceImpl { ... }
Bu anotasyonlara sahip bean'lere erişmek için şöyle yaparız. Burada List<Object> kullanılmasının sebebi bean'lerimiz arasında ortak bir ata sınıf olmaması@Autowired
@Foo
List<Object> fooBeans;
Eğer belli bir ata sınıftan kalıtan ve @Foo anotasyonuna sahip bean'leri istersek şöyle yaparız.@Autowired
@Foo
List<SpecialFooServiceImpl> fooBeans;
Hiç yorum yok:
Yorum Gönder