我正在使用带有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配置实现此目的的正确的方式是什么?谢谢!
答案 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配置的问题。