2015-10-22 13 views
5

Natknąłem się na to link, które wyjaśnia, w jaki sposób można dziedziczyć dziedziczenie. Zakładając, że klasa HelloWorld w tym przykładzie jest wyeksponowana jako komponent bean przy użyciu adnotacji @Component, w jaki sposób można utworzyć inny komponent bean, który dziedziczy ten komponent bean? Czy mogę używać rozszerzeń do dziedziczenia fasoli HelloWorld i dodawania @Component do nowej klasy, aby rozszerzyć istniejący komponent bean, aby odsłonić go jako nowy komponent bean z dodatkowymi funkcjami?Dziedziczenie wiosny - Adnotacja

Odpowiedz

5

Najpierw trzeba dokonać abstrakcyjnej konfigurację , co osiąga się przez nie oznaczając go jako @Configuration, tak:

// notice there is no annotation here 
public class ParentConfig { 

    @Bean 
    public ParentBean parentBean() { 
     return new ParentBean(); 
    } 

} 

następnie rozszerzyć ją tak:

@Configuration 
public class ChildConfig extends ParentConfig { 

    @Bean 
    public ChildBean childBean() { 
     return new ChildBean(); 
    } 

} 

Wynik będzie dokładnie taki sam, jak w przypadku wykonania tej czynności:

@Configuration 
public class FullConfig { 

    @Bean 
    public ParentBean parentBean() { 
     return new ParentBean(); 
    } 

    @Bean 
    public ChildBean childBean() { 
     return new ChildBean(); 
    } 

} 

Edytuj: odpowiedź na pytanie uzupełniające w komentarzu.

Jeśli Wiosna podnosi obie klasy, rodzica i dziecka, nie będzie problemów z powielanych fasoli, więc nie można przedłużyć go bezpośrednio. Nawet jeśli nadpiszesz metody, ziarna z super-klasy również zostaną utworzone przez ParentConfig.

Od klasa dominująca jest już skompilowany, masz 2 opcje:

  1. porozmawiać z autorką klasy nadrzędnej i uprzejmie poprosić go, aby go zmienić.

  2. Zmiana pakietów @ComponentScan.

Aby wyjaśnić na Rozwiązanie 2:

Jeśli klasa dominująca jest w opakowaniu com.parent.ParentConfig a klasa dziecko jest pakiet com.child.ChildConfig można skonfigurować skanowanie komponentów, aby tylko zajęcia podcom.child get podniósł.

Można określić pakiety skanowania składników, korzystając z adnotacji @ComponentScan("com.child") w głównym pliku konfiguracyjnym (należy rozważyć klasę aplikacji).

+0

Dzięki ESala. W moim przypadku klasa, którą próbuję rozszerzyć, jest częścią słoika i jest zdefiniowana przy użyciu adnotacji komponentu. Chcę utworzyć nowy komponent bean, który rozszerza go i zastępuje jedną metodę. –

+0

@PunterVicky Dodałem odpowiedź na twoje kolejne pytanie :) – ESala

+0

Jeszcze raz dziękuję, ESala! –