Каков правильный способ активировать @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.