通过Java配置通过CommonAnnotationBeanPostProcessor激活@PostConstruct的正确方法是什么?

时间:2015-12-08 11:14:23

标签: spring spring-annotations

我正在使用带有SpringBoot的Spring 4和带有Java配置的Spring-Web。

要让Spring在启动时执行@PostConstruct注释方法,必须在上下文中注册CommonAnnotationBeanPostProcessor,否则忽略@PostConstruct

在基于XML的Spring配置中,文档说要使用(在beans元素下)

<context:annotation-config/>

我还看到了一个例子,其中注册是在单个bean的基础上完成的,如下所示:

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

如果可能,我希望避免这种情况。我的项目不包含任何XML文件,并且在我的构建文件夹中没有为我生成。

目前,我的解决方案是使用@ComponentScan注释我的类,我认为这会导致Spring检测并注册@Component@Bean。 不知何故,这会导致CommonAnnotationBeanPostProcessor被调用,虽然我不知道为什么,但它解决了我的问题!

(此类有一个@Autowired属性,在启动时为null - 因此需要通过@PostConstruct进行初始化

但是,我的问题是,使用Java配置实现此目的的正确的方式是什么?谢谢!

2 个答案:

答案 0 :(得分:8)

您可以使用InitializingBean作为替代解决方案。

简单地扩展此接口并覆盖afterPropertiesSet方法,该方法将在设置bean的所有属性后调用,就像post构造一样。

例如:

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

答案 1 :(得分:0)

这不是 对我提出的问题的回答,而是另一种替代解决方案。

我可以实现Lifecycle接口并在start()方法中完成初始化。当时我很难为isRunning()方法返回什么,虽然后见之明说return true本来就足够好,因为它的生命周期是应用程序长的。关于这一点的任何建议都会受到欢迎。

public interface Lifecycle {

  void start();

  void stop();

  boolean isRunning();

}

可以从here推断出其他替代方案,即

<beans default-init-method="init">
我收集的

允许每个 @Bean调用其可选的init()方法。 (我没试过)。

尽管如此,我仍然希望能够回答使用Java配置的问题。