我正在尝试在spring单例bean中启动和停止石英调度程序。但是postconstruct被调用了两次而且predestroy根本没有被调用。 This链接表示由于代理它自然被调用两次但这在postconstruct方法中导致异常。我只想在加载单例bean之后调用一次postConstruct。
答案 0 :(得分:0)
为什么不尝试使用init-method或尝试实现初始化bean。这些为postConstruct提供了替代方法。
当卸载spring bean时,即当关闭容器或通过其他方式调用ConfigurableApplicationContext方法中的close()方法时,将调用preDestroy。
答案 1 :(得分:0)
我编写了一个contextloader监听器并更改了web.xml监听器。所以我只能初始化bean一次。
<listener>
<listener-class>
CustomContextLoaderListener
</listener-class>
</listener>
public class CustomContextLoaderListener extends
org.springframework.web.context.ContextLoaderListener{
Scheduler scheduler;
@Override
public void contextInitialized(javax.servlet.ServletContextEvent event) {
try{
super.contextInitialized(event);
this.scheduler= WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()).getBean(Scheduler.class);
}
@Override
public void contextDestroyed(ServletContextEvent event){
super.contextDestroyed(event);
scheduler.stopSchedulers();
}