Java 11 — Заменить Spring @PostConstruct на afterPropertiesSet или с помощью initMethod

#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:

Ссылка https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-postconstruct-and-predestroy-annotations

Как и @Resource, типы аннотаций @PostConstruct и @PreDestroy были частью стандартных библиотек Java с JDK 6-8. Однако весь пакет javax.annotation был отделен от основных модулей Java в JDK 9 и в конечном итоге удален в JDK 11. При необходимости артефакт javax.annotation-api необходимо получить через Maven Central прямо сейчас, просто для добавления в classpath приложения, как и в любую другую библиотеку.