Каков правильный способ активировать @PostConstruct через CommonAnnotationBeanPostProcessor по конфигурации Java?

Я использую Spring 4 с SpringBoot и Spring -Web с конфигурацией Java.

Чтобы запустить @PostConstruct аннотированные методы, выполняемые Spring, необходимо зарегистрировать CommonAnnotationBeanPostProcessor с контекстом, иначе @PostConstruct игнорируется.

В конфигурации Spring на основе XML документы говорят, что использовать (под элементом beans)

<context:annotation-config/>

Я также видел пример, когда регистрация выполняется на индивидуальной основе bean, например:

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

Я хочу избежать этого, если это возможно. Мой проект не содержит никакого XML файла, и ничто не создано для меня в моей папке сборки.

В настоящее время мое решение состоит в том, чтобы аннотировать мой класс @ComponentScan, который, как я считаю, вызывает Spring для обнаружения и регистрации @Component и @Bean s. Так или иначе, это вызывает CommonAnnotationBeanPostProcessor для вызова, хотя я понятия не имею, почему, но он решает мою проблему!

(Этот класс имеет одно свойство @Autowired, которое при запуске является нулевым, поэтому необходимо выполнить инициализацию через @PostConstruct)

Но опять же, мой вопрос, каков правильный способ достичь этого, используя конфигурацию Java? Спасибо!

Ответ 1

Вы можете использовать InitializingBean в качестве альтернативного решения.

Просто расширьте этот интерфейс и переопределите afterPropertiesSet метод, который будет вызываться после установки всех свойств bean, как и post post.

Например:

@Component
public class MyBean implements InitializingBean 
{
    @Override
    public void afterPropertiesSet()
    {
        // do whatever you want to do here
    }
}

Ответ 2

Это не ответ на мой вопрос, а другой альтернативный вариант.

Я мог бы реализовать интерфейс Lifecycle и выполнил мою инициализацию в методе start(). В то время я был в тупик, что вернуться к методу isRunning(), хотя задним числом говорит, что return true было бы достаточно хорошим, так как его срок службы длится долгое время. Любые предложения по этому вопросу будут приветствоваться.

public interface Lifecycle {

  void start();

  void stop();

  boolean isRunning();

}

Другие альтернативы могут быть выведены из здесь, а именно

<beans default-init-method="init">

который, как я понимаю, позволяет каждому @Bean вызвать его дополнительный метод init(). (Я не пробовал).

Тем не менее, я надеюсь получить ответ на мой вопрос, который использует конфигурацию Java.