Есть ли разница между использованием @PostConstruct
аннотации и объявлением того же метода, что и init-method
в конфигурации Spring XML?
Нет, практически я не думаю, что есть какая-то разница, но есть приоритеты в том, как они работают. @PostConstruct
, init-method
являются BeanPostProcessors.
@PostConstruct
- это аннотация JSR-250, а init-method
в Spring - метод инициализации.@PostConstruct
метод, он будет вызываться перед вызовом методов инициализации.afterPropertiesSet
, сначала @PostConstruct
вызывается, затем, afterPropertiesSet
а затем init-method
.Для получения дополнительной информации вы можете проверить справочную документацию Spring .
До спецификаций JSR 250 использование init-метода в xml было предпочтительным способом, поскольку он отделяет классы Java (beans) от любых классов / аннотаций, специфичных для Spring. Так что, если вы создаете библиотеку, которая не должна зависеть от компонентов инфраструктуры Spring тогда предпочтительным было использование init-метода. Во время создания метода u может указать метод, который должен быть вызван как метод инициализации.
Теперь, с введением спецификаций JSR 250 в Java EE и поддержкой Spring этих аннотаций, зависимость от фреймворка Spring в определенной степени уменьшилась.
Но я должен признать, что добавление этих вещей увеличивает читаемость кода, поэтому у обоих подходов есть свои плюсы и минусы.
Нет никакой реальной разницы. Все зависит от того, как вы предпочитаете настраивать свою систему, и это вопрос личного выбора. Лично я предпочитаю использовать
@PostConstruct
аннотации для своего собственного кода (поскольку bean-компонент правильно настроен только после вызова метода), и я используюinit-method
при создании экземпляров bean-компонентов из библиотек, не поддерживающих Spring (конечно, нельзя применять там аннотации!) но я могу полностью понять людей, которые так или иначе хотят все это делать.источник
@postconstruct не является частью весны. Это часть пакета javax. Оба одинаковые. с помощью init-метода нам нужно добавить в xml файл. Если вы используете @postconstruct, добавление в xml не требуется. Ознакомьтесь со статьей ниже.
http://answersz.com/spring-postconstruct-and-predestroy/
источник
Как вы можете видеть на приведенной ниже диаграмме обратного вызова жизненного цикла создания компонента .
Эти 3 шага выполняются в обратном вызове жизненного цикла создания компонента:
@PostConstruct
будет называться.InitializingBean
реализовано, тоafterPropertiesSet()
будет называться.init-method
или@Bean(initmethod="..")
вызывает метод init.Эта диаграмма взята из Pro Spring 5: подробное руководство по Spring Framework и ее инструментам.
источник
Там может быть разница между
@PostConstruct
иinit-method
потому , что@PostConstruct
обрабатывается вpostProcessAfterInitialization
фазе инициализации боба (AbstractAutowireCapableBeanFactory.initializeBean()
метод) с помощьюCommonAnnotationBeanPostProcessor
, в то время какinit
метод вызывается после завершенияpostProcessBeforeInitialization
фазы (и, по этому вопросу, до началаpostProcessAfterInitialization
фазы).РЕДАКТИРОВАТЬ : Итак, последовательность: 1)
postProcessBeforeInitialization
фаза, 2) вызывается методinit
, 3)postProcessAfterInitialization
фаза, которая вызывает@PostConstruct
метод(В качестве примечания, заявление из принятого ответа
не совсем правильно:
@PostConstruct
обрабатывается aBeanPostProcessor
,init
метод - нет.)Там будет разница , если некоторые (возможно под заказ)
BeanPostProcessor
, который выполнен с (Ordered.getOrder()
) , который будет выполняться после того, какCommonAnnotationBeanPostProcessor
, делает что - то серьезное в егоpostProcessBeforeInitialization
методе.Нет никакой разницы с конфигурацией Spring по умолчанию,
BeanPostProcessors
потому что все,BeanPostProcessors
которые настроены для выполнения послеCommonAnnotationBeanPostProcessor
, ничего не делают вpostProcessBeforeInitialization
методе.В заключение, принятый ответ и подобные ему верны ... в 99% случаев, и этот пост - просто дань уважения концепции "дьявол кроется в деталях"
источник
Полный код здесь: https://github.com/wkaczurba/so8519187 ( spring-boot )
Использование аннотаций:
Получает нас:
источник