我是Spring Boot的新手,我有一个Spring Boot应用程序似乎忽略了@PreDestroy注释 - 当我从命令行或通过Eclipse运行时,我从来没有看到@PreDestroy代码是应用程序关闭时运行(例如通过ctrl-c)
代码低于......
Application.java:
@SpringBootApplication
public class Application {
@Autowired
private MessageProcessor messageProcessor;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@PostConstruct
public void init() {
messageProcessor.run();
}
}
消息处理器配置:
@Configuration
public class MessageProcessorConfiguration {
@Bean
public MessageProcessor messageProcessor() {
return new MessageProcessorImpl();
}
}
消息处理器:
public class MessageProcessorImpl implements MessageProcessor {
@Override
public void run() {
while (isActive()) {
…
}
}
@PreDestroy
public void shutdown() {
System.out.println("MessageProcessorImpl - shutting down");
}
}
答案 0 :(得分:2)
Spring Boot寄存器关闭挂钩
请参阅org.springframework.context.support.AbstractApplicationContext#registerShutdownHook
方法。
因此,必须在 crtl + c 组合上关闭上下文(如果您通过java -jar app.jar
cmd运行应用程序),并依次触发 @Predestroy 方法。这适合我。
我的代码中没有任何评论。我建议使用@Component注释而不是手动 @Bean 声明来注释您的MessageProcessorImpl
bean。
答案 1 :(得分:0)
尝试在您的xml中添加此行。
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
答案 2 :(得分:0)
在豆上使用Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)
时,@ PreDestroy 不起作用,因为用此方法生成的Bean不能完全由IOC容器管理。
在豆上使用Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)
时,@ PreDestroy起作用。