如何在SpringBoot启动时运⾏定制的代码
Spring Boot会⾃动为我们做很多配置,但迟早你需要做⼀些⾃定义⼯作。在本⽂中,您将学习如何挂钩应⽤程序引导程序⽣命周期并在Spring Boot启动时执⾏代码。
1.执⾏bean初始化的⽅法
Spring启动应⽤程序后运⾏某些逻辑的最简单⽅法是将代码作为所选bean引导过程的⼀部分来执⾏。
只需创建⼀个类,将其标记为Spring组件,并将应⽤程序初始化代码放在带有@PostConstruct注释的⽅法中。理论上,您可以使⽤构造函数⽽不是单独的⽅法,但将对象的构造与其实际责任分开是⼀种很好的做法。
@Component
class AppInitializator {
private static final Logger log = Logger(AppInitializator.class);
@PostConstruct
private void init() {
log.info("AppInitializator initialization logic ...");
// ...
}
}
还可以在主Spring Boot应⽤程序类中创建⼀个带有@PostConstruct注释的⽅法。不要忘记主类也是框架管理的组件。
spring boot原理和生命周期
@SpringBootApplication
public class InitDemoApplication {
// ...
@PostConstruct
private void init() {
log.info("InitDemoApplication initialization logic ...");
// ...
}
}
但这种解决⽅案感觉就像是⼀种解决⽅法⽽不是真正的解决⽅案您可以以⾮常有限的⽅式控制Spring框架创建应⽤程序bean 的顺序。如果我们想在创建所有bean之前或甚⾄在框架启动之前运⾏初始化逻辑,我们需要到更好的东西。
2. Spring Boot启动挂钩
使⽤Spring Boot创建的应⽤程序的美妙之处在于,运⾏它们所需的唯⼀内容是Java Runtime Environment和命令⾏界⾯。⽆需外部⼯具或应⽤程序。它就像常规的Java SE程序⼀样运⾏。
作为每个Java程序,您都可以在⼊⼝应⽤程序类的静态main⽅法中开始执⾏此类应⽤程序。这就是你可以挂钩Spring Boot初始化过程的重点。
⾸先更改main⽅法中的代码,以将启动挂钩附加到单独的⽅法中。您应该在应⽤程序启动之前添加Spring Boot挂钩。
public static void main(String[] args) {
SpringApplication application = new SpringApplication(InitDemoApplication.class);
addInitHooks(application);
application.run(args);
}
static void addInitHooks(SpringApplication application) {
// TBD …
}
当Spring Boot应⽤程序启动时,它会在引导过程的各个步骤上发布⼏个事件。SpringApplication类的API公开了⼀个⽅法,我们可以使⽤该⽅法为这些事件添加侦听器。
这是⼀个在Spring上下⽂开始创建bean之前发布的事件上运⾏启动⽅法的⽰例:
static void addInitHooks(SpringApplication application) {
application.addListeners((ApplicationListener<ApplicationEnvironmentPreparedEvent>) event -> {
String version = Environment().getProperty("java.runtime.version");
log.info("Running with Java {}", version);
});
}
根据,Spring传递给侦听器的对象可以让您访问⼏个有⽤的操作。在前⾯的⽰例中,我们读取了⼀些环境属性,但如果需要,我们也可以修改它。
以下是按启动时Spring Boot发布事件的顺序排序的可能事件列表:
ApplicationStartingEvent
ApplicationEnvironmentPreparedEvent
ApplicationContextInitializedEvent
ApplicationPreparedEvent
ApplicationStartedEvent
ApplicationReadyEvent
根据我的经验,最重要的事件是。在Spring Boot启动的这个时刻,尚未创建bean,但您可以访问整个应⽤程序配置。通常,这是运⾏⼀些⾃定义启动代码的最佳时机。
3.在启动时但没有运⾏Tomcat时运⾏代码
尽管Spring Boot设计⼈员在创建框架时考虑了构建胖JAR,但是⼀些开发⼈员仍然将Spring Boot应⽤程序部署到常规的servlet容器(如Tomcat)。如果是这种情况,那么前⼀段中的解决⽅案将⽆法发挥作⽤。除⾮有增加额外步骤。
如果,则可能已经拥有SpringBootServlerInitializator的⾃定义实现。您只需稍微扩展它并添加初始化挂钩作为应⽤程序构建过程的⼀部分。
您可以轻松地重⽤我们在主应⽤程序类中创建的addInitHooks()⽅法。
public class InitDemoWarInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
InitDemoApplication.addInitHooks(builder.application());
return builder.sources(InitDemoApplication.class);
}
}
结论
简⽽⾔之,在Spring Boot启动时运⾏代码有两个主要选项。最简单的⼀个设计⽤于初始化特定的bean。对于更多全局案例,该框架有⼀个专⽤解决⽅案,可以使⽤事件侦听器挂钩其⽣命周期。我们学习了如何实现和设置这样的。
在Github存储库中到完全可⽤的
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。