美文网首页
SpringBoot应用启动后做一些初始化操作

SpringBoot应用启动后做一些初始化操作

作者: AC编程 | 来源:发表于2022-03-19 15:57 被阅读0次

一、场景说明

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应用启动后做一些初始化操作

相关文章

网友评论

      本文标题:SpringBoot应用启动后做一些初始化操作

      本文链接:https://www.haomeiwen.com/subject/oonidrtx.html