#java #spring #java-11 #spring-bean #postconstruct
#java #spring #java-11 #spring-компонент #postconstruct
Вопрос:
Я использую приложения spring, которые иногда используют @PostConstruct
для настройки в коде и тестах
Похоже, что аннотация будет исключена из Java 11:
Обратите внимание, что аннотации @PostConstruct и @PreDestroy являются частью Java EE. И поскольку Java EE устарела в Java 9 и удалена в Java 11, мы должны добавить дополнительную зависимость для использования этих аннотаций
В статье предлагается заменить все @PostConstruct
на afterPropertiesSet
метод
Я рекомендую вам изменить реализацию из аннотации @PostConstruct на реализацию org.springframework.beans.factory.Инициализирующий интерфейс Bean.
Могу ли я слепо заменить его во всех случаях? или есть другие соображения?
Редактировать
Как предположил @JBNizet, это, возможно, не обязательно, поскольку в Spring doc предлагается обратное
Мы рекомендуем вам не использовать интерфейс InitializingBean, потому что это излишне связывает код с Spring. В качестве альтернативы, мы предлагаем использовать аннотацию @PostConstruct или указать метод инициализации POJO.
ПРАВКА 2
Другим вариантом является использование initMethod
:
В конфигурации Java вы можете использовать атрибут initMethod @Bean
@Bean(initMethod = "init") public BeanOne beanOne() { return new BeanOne(); }
Комментарии:
1. Вам следует просто проигнорировать этот совет и продолжать использовать PostConstruct. docs.spring.io/spring/docs/current/spring-framework-reference /…
2. @JBNizet Вы знаете, откуда взялась путаница? есть еще одна ссылка docs.micronaut.io/latest/guide/index.html#java
3. О какой «путанице» вы говорите? Ни Micronaut, ни Spring не перепутаны. Они оба используют PostConstruct . Этого больше нет в JDK, ну и что? Вы добавляете необходимую зависимость, как вы делаете практически для всего остального.
4. @JBNizet вы можете ответить? Все еще есть преимущества меньшей зависимости и размера
5. Кажется вероятным, что Spring предоставит свою собственную
PostConstruct
аннотацию, если и когда она будет удалена из Java. Это предполагает, что Spring еще не предоставляет свою собственную аннотацию PostConstruct
Ответ №1:
Spring использует jakarta.annotation.PostConstruct
. Как участник spring-cloud-kubernetes
, я использовал его и включал в этот проект множество раз. На самом деле мы предпочитаем удаление InitializingBean
.
Ответ №2:
Как и @Resource, типы аннотаций @PostConstruct и @PreDestroy были частью стандартных библиотек Java с JDK 6-8. Однако весь пакет javax.annotation был отделен от основных модулей Java в JDK 9 и в конечном итоге удален в JDK 11. При необходимости артефакт javax.annotation-api необходимо получить через Maven Central прямо сейчас, просто для добавления в classpath приложения, как и в любую другую библиотеку.