一、场景说明
SpringBoot应用启动后自动调用接口(或组件),做一些初始化操作。需要初始化操作的接口:
import org.springframework.stereotype.Component;
@Component
public class SystemInitService {
public void systemInit() {
System.out.println("调用SystemInitService,应用初始化后,进行一些业务操作,如启动某些工作线程,初始化系统某些参数");
}
}
二、实现方式
2.1 实现方式一:ApplicationRunner
定义一个类MyApplicationRunner
实现ApplicationRunner
接口,然后Override这个ApplicationRunner
接口的run方法,就搞定了,代码如下
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
//如果有多个runner需要指定一些顺序
@Order(1)
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Autowired
SystemInitService systemInitService;
@Override
public void run(ApplicationArguments args){
systemInitService.systemInit();
}
}
2.2 实现方式二:ApplicationListener
通过实现ApplicationListener接口,完成事件的监听处理:
import org.springframework.boot.context.event.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
//application and command-line runners (如果有)执行完后发送这个事件,此时应用已经启动完毕
if (event instanceof ApplicationReadyEvent) {
ApplicationContext context = ((ApplicationReadyEvent) event).getApplicationContext();
SystemInitService initService = context.getBean(SystemInitService.class);
initService.systemInit();
return;
}
}
}
监听器Listener注册
方式一:
第一种方式是手动注册,即在SpringApplication初始化的时候添加进去
import com.alanchen.demo.service.MyApplicationListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
//SpringApplication.run(SpringbootTestApplication.class, args);
new SpringApplicationBuilder().sources(SpringbootTestApplication.class)
.listeners(new MyApplicationListener()).run(args);
}
}
方式二:
第二种方式是,自动注册(SpringBoot本身Listener实现也是通过这种方式)。在resources目录下添加META-INF
目录,然后在META-INF目录里添加spring.factories
文件,文件内容是:
org.springframework.context.ApplicationListener=\
com.alanchen.demo.service.MyApplicationListener
通过自动注册的方式main入口就与无listener时一样:
import com.alanchen.demo.service.MyApplicationListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
//new SpringApplicationBuilder().sources(SpringbootTestApplication.class).listeners(new MyApplicationListener()).run(args);
}
}
2.3 服务启动日志
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.4)
2022-03-18 15:13:25.989 INFO 18756 --- [ main] c.a.demo.SpringbootTestApplication : Starting SpringbootTestApplication using Java 1.8.0_131 on LAPTOP-R0R80SCR with PID 18756 (E:\code\springboot-test\target\classes started by kwb in E:\code\springboot-test)
2022-03-18 15:13:25.999 INFO 18756 --- [ main] c.a.demo.SpringbootTestApplication : No active profile set, falling back to 1 default profile: "default"
2022-03-18 15:13:26.542 INFO 18756 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-03-18 15:13:26.547 INFO 18756 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-03-18 15:13:26.547 INFO 18756 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.58]
2022-03-18 15:13:26.645 INFO 18756 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-03-18 15:13:26.645 INFO 18756 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 608 ms
2022-03-18 15:13:26.825 INFO 18756 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-03-18 15:13:26.831 INFO 18756 --- [ main] c.a.demo.SpringbootTestApplication : Started SpringbootTestApplication in 1.07 seconds (JVM running for 1.625)
调用SystemInitService,应用初始化后,进行一些业务操作,如启动某些工作线程,初始化系统某些参数
资料来源:
Application Events and Listeners
ApplicationRunner实现springboot应用启动后做一些初始化操作
网友评论