Czy jest jakaś różnica między użyciem @PostConstruct
adnotacji a zadeklarowaniem tej samej metody, co init-method
w konfiguracji Spring XML?
Nie, praktycznie nie sądzę, żeby było jakakolwiek różnica, ale sposób ich działania ma określone priorytety. @PostConstruct
, init-method
są BeanPostProcessors.
@PostConstruct
to adnotacja JSR-250, podczas gdy init-method
Spring jest sposobem na posiadanie metody inicjalizacji.@PostConstruct
metodę, zostanie ona wywołana najpierw przed wywołaniem metod inicjalizujących.afterPropertiesSet
, najpierw @PostConstruct
jest wywoływana, afterPropertiesSet
a następnie init-method
.Aby uzyskać więcej informacji, zapoznaj się z dokumentacją Springa .
Przed specyfikacją JSR 250 preferowano użycie metody init w xml, ponieważ oddziela ona klasy Java (ziarna) od wszelkich klas / adnotacji specyficznych dla wiosny. wtedy preferowano użycie metody init. Podczas tworzenia metody u można określić metodę, która ma być wywołana jako metoda inicjalizacji.
Teraz, wraz z wprowadzeniem specyfikacji JSR 250 w Java EE i wiosennym wsparciem tych adnotacji, zależność od frameworka sprężynowego została do pewnego stopnia ograniczona.
Muszę jednak przyznać, że dodanie tych rzeczy zwiększa czytelność kodu, więc oba podejścia mają zalety i wady.
Nie ma żadnej różnicy. Wszystko zależy od tego, jak wolisz konfigurować swój system, a to kwestia osobistego wyboru. Ja wolę używać
@PostConstruct
adnotacji dla mojego własnego kodu (ponieważ bean jest poprawnie skonfigurowany dopiero po wywołaniu metody) i używaminit-method
podczas tworzenia instancji fasoli z bibliotek innych niż Spring-aware (nie można tam oczywiście stosować adnotacji!) ale mogę całkowicie zrozumieć ludzi, którzy chcą to robić w taki czy inny sposób.źródło
@postconstruct nie jest częścią wiosny. Jest częścią pakietu javax. Obie są takie same. używając metody init musimy dodać w pliku xml, jeśli używasz @postconstruct dodawanie w xml nie jest wymagane. Przeczytaj poniższy artykuł.
http://answersz.com/spring-postconstruct-and-predestroy/
źródło
Jak widać na poniższym diagramie wywołania zwrotnego cyklu życia tworzenia fasoli .
Ten 3 etap ma miejsce w wywołaniu zwrotnym cyklu życia tworzenia fasoli:
@PostConstruct
zostanie nazwany.InitializingBean
jest zaimplementowana,afterPropertiesSet()
zostanie wywołana.init-method
lub@Bean(initmethod="..")
wywołuje metodę init.Ten diagram pochodzi z Pro Spring 5: Szczegółowy przewodnik po strukturze Spring i jej narzędziach
źródło
Nie może być różnica między
@PostConstruct
ainit-method
ponieważ@PostConstruct
jest obsługiwany wpostProcessAfterInitialization
fazie inicjalizacji fasoli (AbstractAutowireCapableBeanFactory.initializeBean()
metoda) przezCommonAnnotationBeanPostProcessor
, podczas gdyinit
metoda jest wywoływana po zakończeniupostProcessBeforeInitialization
fazy (iz tego sprawy, przed rozpoczęciempostProcessAfterInitialization
fazy).EDYCJA : Tak więc sekwencja to: 1)
postProcessBeforeInitialization
faza, 2) wywołanie metodyinit
, 3)postProcessAfterInitialization
faza, która wywołuje@PostConstruct
metodę(Na marginesie, oświadczenie z zaakceptowanej odpowiedzi
nie jest do końca poprawna:
@PostConstruct
jest obsługiwana przez metodęBeanPostProcessor
,init
metoda nie).Nie będzie różnica jeśli niektóre (potencjalnie niestandardowa)
BeanPostProcessor
, który jest skonfigurowany (Ordered.getOrder()
) mają zostać wykonane poCommonAnnotationBeanPostProcessor
, robi coś poważnego w jegopostProcessBeforeInitialization
metodzie.Nie ma żadnej różnicy w domyślnej konfiguracji Spring,
BeanPostProcessors
ponieważ wszystkie te,BeanPostProcessors
które są skonfigurowane do wykonania poCommonAnnotationBeanPostProcessor
, nie robią nic wpostProcessBeforeInitialization
metodzie.Podsumowując, przyjęta odpowiedź i tym podobne są słuszne ... w 99% przypadków, a ten post jest tylko hołdem dla koncepcji „diabeł tkwi w szczegółach”
źródło
Pełny kod tutaj: https://github.com/wkaczurba/so8519187 ( spring-boot )
Korzystanie z adnotacji:
Dostaje nas:
źródło