Extend Spring Component Annotation
Dzięki temu, że jest ona oparta na adnotacji @Component ze Springa, klasy nią oznaczone będą automatycznie wykrywane i zarządzane przez Springa jako tzw. "ziarna" (beans).
-
Komentarz Javadoc:
-
Definicja Adnotacji:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // Kluczowe dla Springa
public @interface SpecialComponent {
// ...
}
public @interface SpecialComponent: Deklaruje niestandardową adnotację o nazwieSpecialComponent.@Target(ElementType.TYPE): Ta meta-adnotacja określa, że adnotacja@SpecialComponentmoże być stosowana tylko do typów (czyli do klas, interfejsów, wyliczeń, innych adnotacji). W praktyce, w tym kontekście, będzie najczęściej używana do oznaczania klas.@Retention(RetentionPolicy.RUNTIME): Ta meta-adnotacja określa, że informacja o tej adnotacji ma być dostępna w czasie działania programu (runtime) za pomocą mechanizmu refleksji. Jest to niezbędne dla frameworków takich jak Spring, które w czasie działania skanują klasy w poszukiwaniu adnotacji, aby zarządzać komponentami.@Documented: Ta meta-adnotacja powoduje, że jeśli zastosujesz@SpecialComponentdo jakiejś klasy i wygenerujesz dokumentację Javadoc dla tej klasy, informacja o zastosowaniu adnotacji@SpecialComponentzostanie zawarta w tej dokumentacji.@Component: To jest najważniejsza meta-adnotacja w kontekście Springa. Oznacza to, że sama adnotacja@SpecialComponentdziedziczy zachowanie adnotacji@Component. W efekcie, każda klasa, którą oznaczymy adnotacją@SpecialComponent, zostanie automatycznie potraktowana przez Springa tak, jakby była oznaczona adnotacją@Component. Oznacza to, że Spring ją wykryje podczas skanowania komponentów i utworzy z niej "ziarno" (bean) w swoim kontekście aplikacji.
- Atrybut Adnotacji (
String value()) i@AliasFor:
/**
* The value may indicate a suggestion for a logical component name, to be turned into a Spring
* bean in case of an autodetected component.
*
* @return The suggested component name, if any (or empty String otherwise)
*/
@AliasFor(annotation = Component.class)
String value() default "";
String value() default "";: Definiuje atrybut o nazwievaluedla adnotacji@SpecialComponent. Ma on typStringi domyślną wartość (pusty łańcuch""). Atrybutvaluejest specjalny w adnotacjach Javy – jeśli jest jedynym atrybutem lub jedynym, dla którego nie podano wartości, można go pominąć przy użyciu adnotacji (np. zamiast@SpecialComponent(value="nazwa")można napisać@SpecialComponent("nazwa")).@AliasFor(annotation = Component.class): Ta adnotacja ze Springa jest kluczowa. Mówi ona: "Atrybutvaluew tej adnotacji (@SpecialComponent) jest aliasem dla atrybutuvaluew adnotacji@Component".
Co to oznacza w praktyce (dzięki @AliasFor i @Component):
- Gdy użyjesz adnotacji
@SpecialComponentna klasie, np.@SpecialComponent("mojSpecialComponent"), wartość"mojSpecialComponent"którą podasz dla atrybutuvaluew@SpecialComponent, jednocześnie zostanie przekazana jako wartość dla atrybutuvaluew dziedziczonej adnotacji@Component. - Atrybut
valuew adnotacji@Componentsłuży do jawnego podania nazwy ziarna Springa. - W efekcie,
@SpecialComponent("mojSpecialComponent")na klasie jest równoważne z@Component("mojSpecialComponent"). Klasa zostanie zarejestrowana w kontekście Springa pod nazwą "mojSpecialComponent". - Jeśli użyjesz
@SpecialComponentbez podawania wartości (np.@SpecialComponentnad klasą), domyślna wartość""zostanie przekazana do@Component.value(). W takim przypadku Spring nada ziarnu domyślną nazwę (zazwyczaj opartą na nazwie klasy, np.mojSpecialComponentImpl).
Dlaczego tworzy się taką adnotację zamiast po prostu użyć @Component?
- Semantyka i czytelność kodu:
@SpecialComponentjest znacznie bardziej konkretne i opisowe niż ogólne@Component. Od razu widać, że klasa oznaczona@SpecialComponentreprezentuje logikę biznesową związaną z konkretnym przypadkiem użycia, a nie jest po prostu jakimś dowolnym komponentem Springa (jak np. kontroler, serwis pomocniczy, repozytorium itp.). - Warstwy Architektury: Pomaga to w jasnym oddzieleniu warstwy logiki biznesowej od innych warstw aplikacji (np. warstwy prezentacji, warstwy dostępu do danych).
- Specyficzne przetwarzanie: Mimo że nie widać tego w tym fragmencie kodu, posiadanie dedykowanej adnotacji
@SpecialComponentpozwala na łatwe wyszukiwanie wszystkich klas tego typu i stosowanie do nich specyficznej logiki (np. przy użyciu aspektów Spring AOP), takiej jak logowanie, specyficzne zarządzanie transakcjami dla logiki biznesowej, walidacja wejścia do use case'ów itp. - Konwencja w projekcie: Wprowadza spójną konwencję oznaczania klas logiki biznesowej, ułatwiając utrzymanie kodu.