Відповіді:
Ні, практично, я не думаю, що є різниця, але є пріоритети в їх роботі. @PostConstruct
, init-method
є BeanPostProcessors.
@PostConstruct
є анотацією JSR-250, поки init-method
як метод Spring має спосіб ініціалізації.@PostConstruct
метод, він буде викликаний спочатку до виклику методів ініціалізації.afterPropertiesSet
, спочатку @PostConstruct
викликається, потім afterPropertiesSet
і потім init-method
.Для отримання додаткової інформації ви можете ознайомитися з довідковою документацією Spring .
Перед специфікаціями JSR 250 використання методу init в xml було кращим способом, оскільки воно відокремлює класи java (квасоля) від будь-яких весняних специфічних класів / анотацій. Отже, якщо ви будуєте бібліотеку, яка не повинна залежати від весняної інфраструктури тоді метод init був кращим. Під час створення u можна вказати метод, який потрібно називати методом ініціалізації.
Тепер із впровадженням специфікацій JSR 250 у Java EE та весняною підтримкою цих анотацій залежність від весняних рамок певною мірою зменшилась.
Але я повинен визнати, що додавання цих речей підвищує читабельність коду. Отже, є плюси і мінуси обох підходів.
Немає реальної різниці. Це залежить від того, як ви віддаєте перевагу налаштування системи, і це питання особистого вибору. Сам я вважаю за краще використовувати @PostConstruct
анотації для власного коду (оскільки квасоля правильно налаштована лише після виклику методу), і я використовую, init-method
коли інстанціювати боби з бібліотек, що не знають Spring (звичайно, не можу застосовувати анотації там, звичайно!) але я цілком можу зрозуміти людей, які хочуть це зробити так чи інакше.
@postconstruct не є частиною весни. Він є частиною пакету javax. Обидва однакові. використовуючи метод init, нам потрібно додати файл xml. Якщо ви використовуєте @postconstruct, додавання в xml не потрібно. Перегляньте статтю нижче.
Як ви бачите на наведеній нижче схемі зворотного зворотного виклику Bean Creation .
Цей 3 крок відбувається під час зворотного виклику життєвого циклу створення Bean:
@PostConstruct
буде називатися.InitializingBean
буде реалізовано, тоді afterPropertiesSet()
буде викликано.init-method
або @Bean(initmethod="..")
тоді він викликає метод init.Ця діаграма зібрана з програми Pro Spring 5: Поглиблене керівництво до рамки весни та її інструментів
Там може бути різниця між @PostConstruct
і init-method
тому , що @PostConstruct
обробляється в postProcessAfterInitialization
фазі ініціалізації бобу ( AbstractAutowireCapableBeanFactory.initializeBean()
метод) з допомогою CommonAnnotationBeanPostProcessor
, в той час як init
метод викликається після завершення postProcessBeforeInitialization
фази (і, з цього питання, до початку postProcessAfterInitialization
фази).
EDIT : Отже, послідовність: 1) postProcessBeforeInitialization
фаза, 2) init
викликається метод, 3) postProcessAfterInitialization
фаза, яка викликає @PostConstruct
метод
(Як бічна примітка, заява з прийнятої відповіді
@PostConstruct, метод init - це BeanPostProcessors
не зовсім коректно: @PostConstruct
обробляється методом a BeanPostProcessor
, init
метод не є.)
Там буде різниця , якщо деякі (можливо під замовлення) BeanPostProcessor
, який виконаний з ( Ordered.getOrder()
) , який буде виконуватися після того, як CommonAnnotationBeanPostProcessor
, робить що - то серйозне в його postProcessBeforeInitialization
методі.
Чи не Там є не якась -то різниця в конфігурації Spring за замовчуванням , BeanPostProcessors
так як всі , BeanPostProcessors
які сконфігуровані так, щоб виконуватися після того, як CommonAnnotationBeanPostProcessor
, нічого не робити в postProcessBeforeInitialization
методі.
На закінчення, прийнята відповідь і подібне є правильним ... у 99% випадків, і ця посада лише для того, щоб віддати належне поняттю "чорт у деталях"
Повний код тут: https://github.com/wkaczurba/so8519187 ( spring-boot )
Використання приміток:
@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
}
}
Отримує нас:
Оновлення org.springframework.context ...
MyComponent в конструкторі: [null]
MyComponent в postConstruct: [Magic]
MyComponent in afterPropertiesSet: [Magic]
...
Реєстрація бобів для експозиції JMX під час запуску.
Початок DemoApplication за 0,561 секунди (JVM працює на 1,011)
Закриття org.springframework.context .. Видалення JMX-бобів під час відключення
...
MyComponent в preDestroy: [Магія]