核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序

news/2024/4/25 21:03:01/文章来源:https://blog.csdn.net/pingzhuyan/article/details/129041466

目录

1. 业务场景

-> 1.1 初始化操作

-> 1.2 业务操作 

-> 1.3优势

2.  实现方式(多种方式,不同思想)

-> 2.1 定时调度任务(常用四种方式 task )

--> 2.1.1 Timer(单线程)

--> 2.1.2 scheduledExecutorService(多线程并发执行,线程池)  

--> 2.1.3 Spring Task (spring自带的Task任务调度)

--> 2.1.4 Quartz 定时任务调度框架 

-> 2.2 CommandLineRunner代码实现>>>>> 

-> 2.3 ApplicationRunner代码实现>>>>>> 

-> 2.4 InitializingBean: bean初始化之后

--> 2.4.1 执行优先级顺序: 

-> 2.4.2 spring的Bean执行介绍以及操作方式

 ---->2.4.2.1: 测试代码一: 

  ---->2.4.2.2: 测试代码二: 

  ---->2.4.2.3: 测试代码三: (测试结果)

 --> 2.4.2 代码实现>>>>>>>>>>>>

-> 2.5 static静态代码块

--> 2.5.1 代码实现>>>>>>>

 --> 2.5.2 测试结果

 -> 2.6 @PostConstruct注解

--> 2.6.1 优先级在2.4.1 里 图片如下: 

--> 2.6.2 常用使用场景代码实现>>>>>>>>>>

3. 文章总结:


1. 业务场景

-> 1.1 初始化操作

想通过查询测试数据库链接以及第一次创建池链接, 读取配置文件等情况

-> 1.2 业务操作 

同步数据, 同步缓存信息, 检测部分功能是否正常运行等

-> 1.3优势

避免了人员操作, 仅启动类加载启动时执行一次即可

2.  实现方式(多种方式,不同思想)

-> 2.1 定时调度任务(常用四种方式 task )

定时调度任务详细介绍: -> 暂无

--> 2.1.1 Timer(单线程)

        包:  java.util.Timer (基本没用)

--> 2.1.2 scheduledExecutorService(多线程并发执行,线程池)  

        包: package java.util.concurrent;

--> 2.1.3 Spring Task (spring自带的Task任务调度)

        注解: @Scheduled(corn="表达式")  void方法上即可

                 @EnableScheduling 启动类添加

        ps: 建议异步执行 不然默认是同步执行(一个线程)

--> 2.1.4 Quartz 定时任务调度框架 

添加依赖: springboot版本

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

    核心: 类继承 QuartzJobBean, 详情请看下文

-> 2.2 CommandLineRunner代码实现>>>>> 

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;/*** 类加载时自动执行* @author pzy* @version 0.1.0*/
@Order(1) //执行优先级顺序
@Slf4j
@Component
public class MyCommandLineRunner implements CommandLineRunner {@Value("${spring.auto.user.isAutoCheck:false}")private Boolean isAutoCheck;@Autowiredprivate Controller controller; //直接执行即可 注入bean后使用方法@Overridepublic void run(String... args) throws Exception {if(isAutoCheck){log.info("===> MyCommandLineRunner 执行成功 <===")}}
}

-> 2.3 ApplicationRunner代码实现>>>>>> 

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;/*** 类加载时自动执行 方法二* @author pzy* @version 0.1.0*/
@Slf4j
@Component //想使用打开即可
@Order(2)   //如果多个自定义的 ApplicationRunner  ,用来标明执行的顺序
public class ApplicationRunnerStartService implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {log.info("==> 测试初始化 <===");}}

-> 2.4 InitializingBean: bean初始化之后

--> 2.4.1 执行优先级顺序: 

静态代码块> 构造代码块> Constructor > @PostConstruct > InitializingBean > init-method

-> 2.4.2 spring的Bean执行介绍以及操作方式

Spring 的 Bean 是有生命周期的, Bean在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种:

1. 通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法

2. 通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法

3. 方法加@PostConstruct 或@PreDestroy注解 表示是在初始化之后还是销毁之前调用

 ---->2.4.2.1: 测试代码一: 

public class OrderCtrlTest {static {System.out.println("我是一个静态代码块");}{System.out.println("我是一个构造代码块");}public OrderCtrlTest() {System.out.println("我是构造函数");}public static void main(String[] args) {OrderCtrlTest orderCtrlTest = new OrderCtrlTest();//执行结果://我是一个静态代码块//我是一个构造代码块//我是构造函数}}

  ---->2.4.2.2: 测试代码二: 

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;/*** 类加载时自动执行 方法三* @author pzy* @version 0.1.0*/
@Slf4j
@Component
public class AutoInitializingRunner implements InitializingBean {public AutoInitializingRunner() {log.info("==> 1: AutoInitializingRunner的构造方法");}@Beanpublic void initMethod() {log.info("==> 3: initMethod 方法");}@Overridepublic void afterPropertiesSet() {log.info("==> 2: 执行InitializingBean的唯一重写方法");}
}

  ---->2.4.2.3: 测试代码三: (测试结果)

 --> 2.4.2 代码实现>>>>>>>>>>>>

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;/*** 类加载时自动执行 方法三* @author pzy* @version 0.1.0*/
@Slf4j
@Component
public class AutoInitializingRunner implements InitializingBean {@Overridepublic void afterPropertiesSet() {log.info("==> 1: 执行InitializingBean的唯一重写方法");}
}

-> 2.5 static静态代码块

--> 2.5.1 代码实现>>>>>>>

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableScheduling
//@EnableRabbit
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "*")
@EnableTransactionManagement
@ComponentScan(basePackages={"*"})
@MapperScan("*")
@Slf4j
@SpringBootApplication
public class AaaApplication {static{System.out.println("静态代码块执行部分业务可以!");log.info("===> 静态代码块执行部分业务可以!");}public static void main(String[] args) {SpringApplication.run(AaaApplication.class, args);}
}

 --> 2.5.2 测试结果

 -> 2.6 @PostConstruct注解

--> 2.6.1 优先级在2.4.1 里 图片如下: 

--> 2.6.2 常用使用场景代码实现>>>>>>>>>>

    @Value("${spring.redis.host}")public String ip;@Value("${spring.redis.password}")public String redisPassword;public static String IP;public static String REDIS_PASSWORD;@PostConstructpublic void init() {IP = ip;REDIS_PASSWORD = redisPassword;}

3. 文章总结:

实现一个功能有不同的解决方式, 只有不断的尝试, 探索, 寻找到与当前业务更加贴合的技术, 技术是为业务服务的, 制作不易

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72031.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux部署zookeeper

linux部署zookeeper 1、单机部署zk ZooKeeper服务器是用Java创建的&#xff0c;它需要在JVM上运行&#xff0c;所以需要使用JDK1.6及以上版本&#xff0c;一般都是jdk1.8。 选择自己安装本地的jdk&#xff0c;而不是centos自带的openjdk。 查看本地安装的jdk&#xff1a; j…

【C++的OpenCV】第二课-CMake创建OpenCV项目

文章目录一、CMake是什么&#xff1f;1.1 基本概念1.2 CMake的优势二、使用Cmake构建一个OpenCV程序2.1 步骤&#xff08;a&#xff09;编写一个简单的OpenCV示例代码&#xff08;b&#xff09;创建一个Cmake文件&#xff08;c&#xff09;生成可执行文件&#xff08;d&#xf…

DAX 微信 markdown 编辑器

DAX 微信 markdown 编辑器 一、致谢 感谢开源项目&#xff1a; md wechat-format 感谢 WordPress 插件 Mine云点播 作者 mine27 的指导。 二、如何使用 打开如下地址&#xff0c;直接编辑&#xff0c;可以实时看到符合微信公众号排版的效果。 推荐访问&#xff1a;https://j…

线上问题诊断指南

内容概要 诊断工具介绍工具可用情况偶现或已现问题诊断思路 硬件资源观测 top top可以看整个系统cpu、内存的使用情况&#xff0c;以及在各个进程上的情况&#xff0c;如下&#xff1a; $ top top - 13:14:07 up 2 days, 6:38, 0 users, load average: 1.65, 0.59, 0.27…

只因小黑子:SVG

小黑子的SVG复习SFV画布1. 初始SVG2. SVG绘制矩形、圆形和椭圆形2.1 rect 矩形2.2 circle 圆形2.3 ellipse 椭圆4. SVG绘制线条、多边形和多线条4.1 line 线条4.2 polygon 多边形4.3 polyline 多线条5. SVG绘制文本 text6. SVG绘制路径 path7. SVG描边属性8. SVG 模糊和阴影效果…

vue3.2中使用swiper缩略图轮播教程

介绍 在vue3 中使用 swiper 实现缩略图的轮播图效果,具体如下图所示: 使用 切换到项目终端 ,输入命令 npm install swiper --save , 进行安装在 main.js里,引入 swiper.css并使用,具体代码如下;import {createApp } from vue import App from ./App.vue import router…

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义&#xff1a;transparence Network Substrate透明网络底层&#xff0c; 监听服务是它重要的一部分&#xff0c;不是全部&#xff0c;不要把TNS当作只是监听器。 TNS是Oracle Net…

Centos7搭建hadoop3.3.4分布式集群

文章目录1、背景2、集群规划2.1 hdfs集群规划2.2 yarn集群规划3、集群搭建步骤3.1 安装JDK3.2 修改主机名和host映射3.3 配置时间同步3.4 关闭防火墙3.5 配置ssh免密登录3.5.1 新建hadoop部署用户3.5.2 配置hadoopdeploy用户到任意一台机器都免密登录3.7 配置hadoop3.7.1 创建目…

linux shell脚本详解

一、!/bin/bash --- 指定脚本解释器 二、注释 1、单行注释 以 # 开头的行就是注释 2、多行注释 一般使用第一种&#xff01;来注释 三、变量 只读变量 使用 readonly 命令可以将变量定义为只读变量&#xff0c;只读变量的值不能被改变。 删除变量 unset variable_name…

社招中级前端笔试面试题总结

HTTP世界全览 互联网上绝大部分资源都使用 HTTP 协议传输&#xff1b;浏览器是 HTTP 协议里的请求方&#xff0c;即 User Agent&#xff1b;服务器是 HTTP 协议里的应答方&#xff0c;常用的有 Apache 和 Nginx&#xff1b;CDN 位于浏览器和服务器之间&#xff0c;主要起到缓存…

前端页面jquery规范写法

使用最新版本的 jQuery 最新版本的 jQuery 会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的 jQuery。以下是三条常见的 jQuery 语句,版本越新,性能越好: $(.elem) $(.elem, context) context.find(.elem) 结果 1.6.2 版执行次数远超两个老版本。 jQ…

一文解决Rust字符串:String,str,String,str,CString,CStr

一、str和&str和String的区别 1.存放位置&#xff0c;可变不可变&#xff1a; str来源于Rust本身的数据类型&#xff0c;而String类型来自于标准库。首先看一下str 和 String之间的区别&#xff1a;String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的…

ElementUI分页的实现

官网地址&#xff1a;Element - The worlds most popular Vue UI framework 第一步&#xff1a;拷贝你喜欢的分页类型放在你的组件页面需要用到的分页位置 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-p…

记一次:request请求总结

前言&#xff1a;和前端联调的时候发现前端人员请求的方式不对&#xff0c;固做此总结问题&#xff1a;request请求方式有多少种&#xff1f;答&#xff1a;Java后端查看有8种&#xff0c;spring-web中的java枚举图如下而使用PostMan查看有15种&#xff0c;如下图GET&#xff0…

【重点掌握】Java基础之Javaweb核心技术详解

都说一入Java深似海&#xff0c;从此代码是爱人&#xff0c;但是学习的过程却从来都不轻松。当下&#xff0c;越来越多的互联网企业&#xff0c;招聘Java工程师时&#xff0c;明确写道需熟练掌握JavaWeb技术。作为衔接前后端的重要一环&#xff0c;JavaWeb技术已成为程序员向大…

火热报名 | DockQuery 1.2 beta版本体验官开启招募!

DockQuery是什么&#xff1f; DockQuery 代号「天狼」&#xff0c;是图尔兹全新自研的一款专业新型数据库桌面客户端&#xff0c;专为信创背景下国内外数据库开发/管理而设计&#xff0c;全面覆盖信创数据库目录、支持国内外操作系统。 目前&#xff0c;DockQuery 仅以社区版…

【教程】GitBook Editor编写电子书

GitBook Editor电子书编写说明1、安装软件2、创建文档3、编辑文档4、生成电子书1、安装软件 下载并安装GitBook Editor软件&#xff0c;网上资源很多&#xff0c;根据自己系统选用即可 官网参考&#xff1a;GitBook - Where technical teams document. 2、创建文档 1&#xf…

Talk | 清华大学交叉信息研究院助理教授杜韬:利用计算方法探究流固耦合

本期为TechBeat人工智能社区第474期线上Talk&#xff01; 北京时间2月15日(周三)20:00&#xff0c;清华大学交叉信息研究院助理教授——杜韬的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “利用计算方法探究流固耦合”&#xff0c;届时将介绍流固…

HTTP与HTTPS原理

目录 HTTP 协议背景 协议格式 请求行 请求报头 请求正文&#xff08;有效载荷&#xff09; 响应行 HTTPS原理 协议背景 什么是加密&#xff1f; 为什么要加密&#xff1f; 加密方式 数据摘要&#xff08;数据指纹&#xff09; 协议加密方案实现探究 方案一&#xff1a;只使用对…

【云原生】初识Kubernetes的理论基础

一、kubernetes概述 1.1 kubernetes介绍 K8S的全称为Kubernetes (K12345678S)&#xff0c;首字母与尾字母中间有8个字母&#xff0c;缩写为K8S 作用 用于自动部署、扩展和管理“容器化(containerized) 应用程序”的开源系统。可以理解成K8S是负责自动化运维管理多个容器化程序…