Spring Boot @PreDestroy注释不起作用

时间:2017-04-13 12:50:30

标签: java spring-boot

我是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");
   }

}

3 个答案:

答案 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起作用。