2015-02-26 6 views
5

Uczę się przy użyciu Spring 4 przy pomocy adnotacji Java, i nie mogłem znaleźć sposobu ustawienia domyślnej metody init dla wszystkich ziaren należących do konkretnej konfiguracji, bez dodawania adnotacji @PostContruct w celu zainicjowania metody we wszystkich klauzulach i nie czyniąc ich implementacją InitializeBean interfejs ... chcę po prostu zrobić coś takiego:jak ustawić domyślną metodę init fasoli przez adnotacje na wiosnę 4?

<beans default-init-method="init"> 

    <bean id="blogService" class="com.foo.DefaultBlogService"> 
    </bean> 

    <bean id="anotherBean" class="com.foo.AnotherBean"> 
    </bean> 

</beans> 

Tak, chcę, aby dokładnie to zrobić przez adnotacji Java, chcę ustawić domyślne fasola konfiguracje w kontenerze konfiguracyjnym fasoli. Czy to jest możliwe? Pozdrawiam:

EDYTOWANIE: To, co naprawdę chcę zrobić, to powiedzieć wiosce, aby domyślnie uruchamiała metodę "inicjowania" na wszystkich ziarnach, które tworzę w klasie BeansConfigurations. Oznacza to, umieścić adnotację lub coś, co ustala, że ​​wszystkie zawarte fasoli uruchomi tę metodę initialize domyślnie. Ale jak już wspomniałem wcześniej, nie chcę dotykać klas fasoli, tzn. Nie chcę dodawać adnotacji @PostConstructor do każdej metody initialize dla każdej klasy komponentu bean i nie chcę, aby każdy komponent bean implementował interfejs InitializeBean albo

+0

Możesz zajrzeć do "BeanPostProcessor", ale czy możesz wyjaśnić nieco swoją sprawę użycia? Być może istnieje inny sposób, aby dojść do tego samego wyniku. – geoand

+0

Właśnie edytowałem więcej informacji. Dzięki! – jscherman

Odpowiedz

5

można wykonać następujące czynności:

@Configuration 
public class SomeConfig { 

    @Bean(initMethod = "initMethodName") 
    public SomeBeanClass someBeanClass() { 
     return new SomeBeanClass(); 
    } 
} 

byłoby powtórzyć, że dla każdego fasoli chcesz zadzwonić initMethodName dalej.

Można podjąć krok dalej i realizuje meta-annotation jak

@Bean(initMethod = "initMethodNAme") 
public @interface MyBean { 
} 

i po prostu użyć @MyBean zamiast @Bean(initMethod = "initMethodName") w SomeConfig

+0

Dzięki! Nie mogę uwierzyć, że nie widziałem tego w dokumentacji. Jednak w ten sposób muszę zaimplementować nazwę initMethod na każdym komponencie bean wewnątrz "SomeConfig" (używając twojego przykładu). Czy wiesz, że istnieje jakiś sposób na speficy initMethod do całej konfiguracji? – jscherman

+1

Twoje powitanie! To, co napisałem, to najłatwiejszy sposób myślenia. Prawdopodobnie możesz użyć jakiegoś 'BeanPostProcessor' wraz z refleksją, ale to byłoby o wiele bardziej zaangażowane. Jednak jeśli użyjesz meta-adnotacji, którą pokazałem w swojej odpowiedzi, nie musisz określać 'initMethod' dla każdego komponentu bean. Po prostu zamień '@ Bean' na' @ MyBean', a wszystko gotowe – geoand

0

Jeśli dobrze rozumiem pytanie, chcesz za każdym fasoli uruchomić jego metoda init (jeśli posiada) bez deklarowania ich wszystkich w pliku konfiguracyjnym. Myślę, że twój własny post ma już odpowiedź: jest to default-init-method="init". W boku klas bean, które chcesz zainicjować, zaimplementuj metodę public void init() w każdym z nich. Wszystkie zostaną wywołane, gdy aplikacja uruchomi się.

Powiązane problemy