我是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");
}
}发布于 2017-09-25 18:48:50
Spring Boot寄存器在上下文创建期间的关闭钩子,参见org.springframework.context.support.AbstractApplicationContext#registerShutdownHook方法。因此,必须在crtl+c组合上关闭上下文(如果您通过java -jar app.jar命令运行您的应用程序),这反过来会触发@Predestroy方法。这对我很有效。
我在您的代码中看不到任何注释。我建议使用@Component注解来注释MessageProcessorImpl bean,而不是手动使用@Bean声明。
发布于 2019-11-20 00:24:43
当在bean上使用时,@PreDestroy不能使用Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE),因为使用此方法生成的bean并不完全由IOC容器管理。
当在bean上使用Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)时,@PreDestroy起作用。
发布于 2019-09-13 02:07:44
尝试在xml中添加此行。
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />https://stackoverflow.com/questions/43392828
复制相似问题