Bean生命周期管理Spring Boot

sch*_*e92 6 java spring tomcat

我目前正在尝试将Spring Boot应用程序部署到外部Tomcat实例中,并且遇到了一些关于如何最好地管理某些事物的实例化的问题.

按照目前的结构,我有类似的东西

public class MyClass extends SpringBootServletInitializer{


@Bean
public ThreadPool pool(){
    return new ThreadPool();
}

@Bean
public BackgroundThread setupInbox() {
    BackgroundThread inbox = new BackgroundThread(pool());
    inbox.start();
    return inbox;
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(MyClass.class);
}

public static void main(String[] args) throws Exception {
    SpringApplication.run(MyClass.class, args);
}


}
Run Code Online (Sandbox Code Playgroud)

其中BackgroundThread是一个正在为新作业侦听AMQP类型消息队列的线程.我知道Spring提供了一些RabbitMQ方法来实现这一点,但我们并没有使用Rabbit,因此它无济于事.

正在部署的*.war文件的整个目的是通过消息传递向线路暴露一些功能,所以我的问题是在Spring的生命周期中实例化,启动然后销毁BackgroundThread的最佳方法是什么?XML配置?

Fab*_*och 5

从文档:

JSR-250 @PostConstruct和@PreDestroy批注通常被认为是在现代Spring应用程序中接收生命周期回调的最佳实践。使用这些注释意味着您的bean没有耦合到特定于Spring的接口。

有关详细信息,请参见第7.9.8节“ @PostConstruct和@PreDestroy”

这些注释应放在一些init和cleanup方法上:

@PostConstruct
public void initAfterStartup() {
    ...
}

@PreDestroy
public void cleanupBeforeExit() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

也有用:

每个SpringApplication都会向JVM注册一个关闭钩子,以确保ApplicationContext在退出时正常关闭。可以使用所有标准的Spring生命周期回调(例如DisposableBean接口或@PreDestroy批注)。

另外,如果bean希望在应用程序结束时返回特定的退出代码,则可以实现org.springframework.boot.ExitCodeGenerator接口。