Odpowiedzi:
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żywam init-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.
@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ł.
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
Nie może być różnica między @PostConstruct
a init-method
ponieważ @PostConstruct
jest obsługiwany w postProcessAfterInitialization
fazie inicjalizacji fasoli ( AbstractAutowireCapableBeanFactory.initializeBean()
metoda) przez CommonAnnotationBeanPostProcessor
, podczas gdy init
metoda jest wywoływana po zakończeniu postProcessBeforeInitialization
fazy (iz tego sprawy, przed rozpoczęciem postProcessAfterInitialization
fazy).
EDYCJA : Tak więc sekwencja to: 1) postProcessBeforeInitialization
faza, 2) wywołanie metody init
, 3) postProcessAfterInitialization
faza, która wywołuje @PostConstruct
metodę
(Na marginesie, oświadczenie z zaakceptowanej odpowiedzi
@PostConstruct, metoda-init to BeanPostProcessors
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 po CommonAnnotationBeanPostProcessor
, robi coś poważnego w jego postProcessBeforeInitialization
metodzie.
Nie ma żadnej różnicy w domyślnej konfiguracji Spring, BeanPostProcessors
ponieważ wszystkie te, BeanPostProcessors
które są skonfigurowane do wykonania po CommonAnnotationBeanPostProcessor
, nie robią nic w postProcessBeforeInitialization
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”
Pełny kod tutaj: https://github.com/wkaczurba/so8519187 ( spring-boot )
Korzystanie z adnotacji:
@Slf4j
@Component
public class MyComponent implements InitializingBean {
@Value("${mycomponent.value:Magic}")
public String value;
public MyComponent() {
log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
}
@PostConstruct
public void postConstruct() {
log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
}
@Override // init-method; overrides InitializingBean.afterPropertiesSet()
public void afterPropertiesSet() {
log.info("MyComponent in afterPropertiesSet: [{}]", value); // (2) displays: Magic
}
@PreDestroy
public void preDestroy() {
log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
}
}
Dostaje nas:
Odświeżam org.springframework.context ...
MyComponent w konstruktorze: [null]
MyComponent in postConstruct: [Magic]
MyComponent in afterPropertiesSet: [Magic]
...
Rejestrowanie komponentów bean do wyświetlania JMX podczas uruchamiania
Uruchomiono aplikację DemoApplication w 0,561 sekundy (JVM działa w wersji 1.011)
Zamykanie org.springframework.context .. . Wyrejestrowywanie komponentów bean eksponowanych na JMX przy wyłączaniu
...
MyComponent w preDestroy: [Magic]