7 Eylül 2023 Perşembe

SpringContext @Qualifier Anotasyonu - Custom Annotation

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;
Örnek
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