首页 > 其他分享 >SpringBoot 初始化资源

SpringBoot 初始化资源

时间:2024-09-23 14:35:31浏览次数:8  
标签:初始化 SpringBoot System 事件 println public 资源 out

1 、使用接口ApplicationRunner和CommandLineRunner

这两个接口都是在容器运行后执行的,如下图示

 如果项目需要在系统启动时,初始化资源,可以继承这两个接口,实现诸如缓存预热、DB连接等。

实现ApplicationRunner接口

@Component
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("缓存预热~");
        System.out.println("DB连接~");
        System.out.println("日志系统初始化~");
        System.out.println("资源文件初始化~");
        System.out.println("常驻后台线程的资源初始化~");

    }
}
View Code

实现CommandLineRunner接口

@Component
public class MyCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("缓存预热~");
        System.out.println("DB连接~");
        System.out.println("日志系统初始化~");
        System.out.println("资源文件初始化~");
        System.out.println("常驻后台线程的资源初始化~");
    }
}
View Code

2、监听spring事件ApplicationListener<>

ApplicationContext事件的实现机制是观察者模式,通过两个接口ApplicationEvent和ApplicationListener来实现。

spring容器在初始化时,会在不同的阶段,发布ApplicationEvent事件,因此,可以通过ApplicationListener监听各个阶段的事件来实现不同的功能。

spring提供了以下ApplicationEvent事件:

  1. ContextStartedEvent 上下文启动事件,此 Start 事件是当Spring容器启动时发布,即调用 start() 方法是执行,意味着所有Lifecyc Bean 都监听到了 start 事件。
  2. ContextRefreshedEvent 上下文刷新事件 

    此 Refreshed 事件是当容器实例化时发布,即执行 refresh() 方法,此时所有的 Bean 都已加载,后置处理器被激活,容器中所有的对象就可以使用,如果容器支持热重载,则 refresh 可以被触发多次(XmlWebApplicatonContext支持热刷新,而GenericApplicationContext则不支持)。

  3. ContextStoppedEvent  上下文停止事件 当使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
  4. ContextClosedEvent 上下文关闭事件 当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
  5. RequestHandledEvent 请求处理完成事件 此 Request handled 事件只在使用spring的DispatcherServlet时有效,当一个请求被处理完成时发布。

基于以上事件类型,我们可以监听ContextRefreshedEvent事件,初始化系统资源,以及监听ContextStoppedEvent事件来清理资源。

初始化资源:

@Component
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("做一些初始化的工作,比如缓存预热~");
        ApplicationContext ct= event.getApplicationContext();
        System.out.println(ct);
    }
}
View Code

清理资源:

@Component
public class MyApplicationStopListener implements ApplicationListener<ContextStoppedEvent> {
    @Override
    public void onApplicationEvent(ContextStoppedEvent event) {
        System.out.println("做一些清理资源的工作,比如缓存清理,DB连接清理~");
        ApplicationContext ct= event.getApplicationContext();
        System.out.println(ct);
    }

    @Override
    public boolean supportsAsyncExecution() {
        return ApplicationListener.super.supportsAsyncExecution();
    }
}
View Code

3、@PostConstruct、@PreDestroy注解

@PostConstruct注解时针对Bean初始化完成后,要执行的方法,@PreDestroy注解时Bean销毁时执行。

@Component
public class RedisInit {
    @PostConstruct
    public void init(){
        System.out.println("缓存预热~");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("缓存清理~");
    }
}
View Code

 

4、InitializingBean、DisposableBean接口

InitializingBean、DisposableBean 接口也是针对的Bean的。

@Component
public class RedisInitializingBean implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("缓存预热~");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("缓存清理~");
    }
}
View Code

5、配置Bean时,指定Bean的init和destroy方法

@Bean(name = "redisInit",initMethod = "init",destroyMethod = "")
    public RedisInit redisInit(){
        return new RedisInit();
    }
View Code

 



标签:初始化,SpringBoot,System,事件,println,public,资源,out
From: https://www.cnblogs.com/zhiyu/p/18427016

相关文章

  • C++类成员变量初始化顺序
    C++类成员变量初始化顺序类成员初始化顺序与其在类中声明顺序一致。比如classDemo{public: Demo(intd) :_d1{d},_d2{_d1+10} { } voidshow(){ std::cout<<"d1="<<_d1<<std::endl; std::cout<<"d2="<<_d2<<std:......
  • 基于SpringBoot的公寓报修管理系统【附源码】
    基于SpringBoot的公寓报修管理系统(源码+L文+说明文档)    目录4系统设计  4.1 系统概要设计  4.2 系统功能结构设计  4.3 数据库设计  4.3.1 数据库E-R图设计  4.3.2数据库表结构设计  5 系统实现   5.1 住户管理  5.2 房间管理  ......
  • 基于SpringBoot的健身房管理系统【附源码】
    基于SpringBoot的健身房管理系统(源码+L文+说明文档)   目录4系统设计  4.1系统概述  4.2 系统结构设计  4.3功能结构设计  4.4.2数据库表结构  第5章系统实现   5.1管理员功能实现  5.1.1 健身房管理  5.1.2 器材信息管理  5.1.3器材......
  • 基于springboot+vue的高校学生考勤系统-可用于计算机毕设-课程设计-练手学习
    博主简介:......
  • 20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理
    ContainerLess理念微服务把应用和它所依赖的组件包、配置文件及附带的运行脚本打包成一个单一、独立、可执行的jar包文件。在实现Web服务器时,几乎不需要任何配置就可以启动Tomcat。你只需要使用java-jar命令就可以让Tomcat成为SpringBoot的一个自包含的可运行组件和单元。同时,这......
  • Docker是什么-通过部署一个SpringBoot项目到Docker来快速理解它
    Docker是什么Docker是一个开源的容器化技术,它可以使开发人员将自己的程序打包成一个完整的镜像,这个镜像包含了程序以及它依赖的运行环境,可以任意系统的机器上部署,只要其安装了Docker。下面介绍下Docker和核心的概念容器化(container)服务程序部署可以分为三个阶段物理机器部署,......
  • SpringBoot中基于JWT的双token(access_token+refresh_token)授权和续期方案
    微服务架构中,JWT认证方案中,用户登录成功后,后端会生成一个JWT格式的access_token并发送给前端。前端接收后,会将此access_token安全地存储在浏览器的LocalStorage中,以便在后续请求中作为身份认证的依据。每次API请求时,前端都会将access_token附加在请求头中发送给后端,后端则通过过......
  • SpringBoot前后端接口加解密--解决方案
    开放接口-通信方式采用HTTP+JSON或消息中间件进行通信。-调用接口之前需要使用登录鉴权接口获得token。-当鉴权成功之后才能调用其他接口(携带Token)。登录接口:Code 说明200 成功401 未授权,请先登录。403 没有访问权限404 接口不存在500 接口内部错误但是开放接口......
  • SpringBoot + Disruptor 实现特快高并发处理,支撑每秒 600 万订单无压力!
    01、背景02、Disruptor介绍03、Disruptor的核心概念04、RingBuffer05、SequenceDisruptor06、Sequencer07、SequenceBarrier08、WaitStrategy09、Event10、EventProcessor11、EventHandler12、Producer13、案例-demo14、总结01、背景工作中遇到项目使用Di......
  • SpringBoot实战:JWT Token 自动续期的解决方案
    前言在前后端分离的开发架构中,当用户成功登录后,后端服务会生成一个JWT(JSONWebTokens)token,并将其返回给前端。前端(如Vue应用)接收到此token后,通常会将其存储在LocalStorage中以方便后续请求时使用。每次向后端发送请求时,前端会将这个token作为请求头的一部分发送给后端,以便后端通......