spring启动时加载外部配置并实现在不重启应用的情况下修改druid连接池的配置
平常同学们使用spring搭建工程时一些应用配置信息(例如数据库的连接配置、中间件的连接配置、第三方API等。。。)都是写在工程的classpath路径下的application-xxx.yml配置文件中,这样通常会存在一个问题,比如应用换库了或者数据库密码修改了,或者API信息变更了,遇到这些情况咱们的做法都是,先修改应用中的配置然后在重新打包并启动应用,所以很麻烦也容易出错,如果应用是分布式的还得在多折腾几遍。那么咱们能不能把这些配置集中写到一个地方呢,然后让spring启动时加载我们的外部配置,遇到配置变更只需要修改外部的配置文件然后重启应用就可以,省掉了重新打包的过程。
1、spring启动时加载外部配置解决方案
针对上述诉求我们可以使用springboot提供的spi机制spring Factories。它类似一种插件机制,第三方根据spingboot规定的方式配置自己的实现,然后springboot会在启动时扫描加载并初始化该配置,在spring-boot下有很多相关配置。
1.1、springgboot加载spring factories原理
springboot在初始化时会加载当前类路径以及jar包中META-INF/spring.factories文件。
如果普通bean想使用该机制必须要加@configuration注解,并且在spring.factories中标注为org.springframework.boot.autoconfigure.EnableAutoConfiguration。如下图中咱们测试的类TestBean被初始化了。
1.2、spring启动时加载外部配置文件(这里以加载外部数据库配置讲解)
上面讲解了下spring.factories的加载原理,那么我们就可以使用该机制在应用启动前加载外部数据库配置到spring容器中,然后在实例化datasource的时候从容器中获取该配置。具体的我们可以自定义一个类并实现Environment的后置处理接口EnvironmentPostProcessor并重写其postProcessEnvironment方法。
首先加载磁盘上的配置文件,当然该配置文件也可以从网络上获取(使用UrlResource),然后使用PropertiesPropertySourceLoader加载配置并添加到ConfigurableEnvironment中。
package com.bbs.config;import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.env.PropertiesPropertySourceLoader;
import org.springframework.boot.env.PropertySourceLoader;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;import java.io.IOException;
import java.util.List;/*** @Author whh* @Date: 2023/03/17/ 23:13* @description** 使用spring上下文环境的后期处理接口加载外部的配置文件* 然后通过springboot的spi机制加载*/
public class DiskPropertyLoadProcessor implements EnvironmentPostProcessor {private final PropertySourceLoader propertyLoader = new PropertiesPropertySourceLoader();@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// new UrlResource()Resource resource = new FileSystemResource("/BBS/bbs.properties");try {List<PropertySource<?>> load = propertyLoader.load(resource.getFilename(), resource);for (PropertySource<?> e : load) {environment.getPropertySources().addFirst(e);}} catch (IOException e) {e.printStackTrace();}}
}
新建咱们自己的spring.factories,在resource目录下新建META-INF文件夹然后新建spring.factories将咱们自己的配置写进去。
org.springframework.boot.env.EnvironmentPostProcessor=\
com.bbs.config.DiskPropertyLoadProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.bbs.util.TestBean
从ConfigurableEnvironment 中获取配置初始化DruidDatasource。
@Bean@Primarypublic DataSource ds(ConfigurableEnvironment env) throws SQLException {MutablePropertySources propertySources = env.getPropertySources();PropertySource<?> propertySource = propertySources.get("bbs.properties");String userName = (String) propertySource.getProperty("db.username");String password = (String) propertySource.getProperty("db.password");DruidDataSource ds = new DruidDataSource();ds.setUrl("jdbc:mysql://localhost:3306/mydb?useUnicode=true&rewriteBatchedStatements=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true");ds.setDriverClassName("com.mysql.cj.jdbc.Driver");ds.setUsername(userName);ds.setPassword(password);ds.setInitialSize(3);ds.setMinIdle(3);ds.setMaxActive(5);ds.setTestWhileIdle(true);ds.setValidationQuery("select 1");ds.init();return ds;}
2、如何在不重启应用的情况下修改druid连接池的配置
上面我们实现了从外部文件加载配置,但是还是要重启应用才能让配置生效,那么咱们能不能在不重启应用的情况下让配置生效呢。实现上面的诉求可以分为如下两步:
- 监听磁盘上配置文件的变化
- 当文件变化时重新初始化连接池的配置
这里咱们自定义了一个DiskDBPropertyMonitor类并实现了ApplicationContextAware 接口,主要逻辑就是开启一个线程不断轮询文件所发生的事件,如果检测到文件修改事件那么就从spring的容器中获取当前的数据源,然后重新加载磁盘上的配置并更新数据源的配置。
由于DiskDBPropertyMonitor需要ApplicationContext所以需要将其配置到spring容器中。
package com.bbs.util.filemonitor;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.FileSystemResource;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.*;
import java.util.Properties;/*** @Author whh* @Date: 2023/03/18/ 13:26* @description*/
public class DiskDBPropertyMonitor implements ApplicationContextAware {//文件监听器private final WatchService watcher;//文件监听器返回的keyprivate final WatchKey watchKey;//监听的文件目录private final Path path;//文件的最后修改时间private long lastModify;private ApplicationContext ctx;/*** @param dir* @throws IOException*/public DiskDBPropertyMonitor(File dir) throws IOException {this.watcher = FileSystems.getDefault().newWatchService();//注册文件夹监听path = Paths.get(dir.getAbsolutePath());this.watchKey = path.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);//new Thread(this::monitor,"Thread-DiskDBPropertyMonitor").start();}/*** 监控外部数据配置文件的情况并重新初始化数据源*/public void monitor() {for (; ; ) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}for (WatchEvent<?> event : watchKey.pollEvents()) {WatchEvent.Kind<?> kind = event.kind();if (kind == StandardWatchEventKinds.OVERFLOW) {continue;}WatchEvent<Path> ev = (WatchEvent<Path>) event;Path context = ev.context();Path child = this.path.resolve(context);File file = child.toFile();if (StandardWatchEventKinds.ENTRY_MODIFY.name().equals(kind.name()) && lastModify != file.lastModified() && file.length() > 0) {this.lastModify = file.lastModified();DruidDataSource druidDataSource = ctx.getBean(DruidDataSource.class);if (druidDataSource != null) {FileSystemResource resource = new FileSystemResource(file.getPath());try (InputStream is = resource.getInputStream()) {Properties props = new Properties();props.load(is);if (druidDataSource.isInited()) {druidDataSource.close();druidDataSource.restart();druidDataSource.setUsername((String) props.get("db.username"));druidDataSource.setPassword((String) props.get("db.password"));} else {druidDataSource.setUsername((String) props.get("db.username"));druidDataSource.setPassword((String) props.get("db.password"));}druidDataSource.init();} catch (Exception e) {e.printStackTrace();}}}}}}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.ctx = applicationContext;}public interface MonitorProcessor {void process(File file);}}
将DiskDBPropertyMonitor注册到spring容器中
@Beanpublic DiskDBPropertyMonitor diskDBPropertyMonitor() throws IOException {DiskDBPropertyMonitor monitor = new DiskDBPropertyMonitor(new File("/BBS"));return monitor;}
3、写在后面
生产上数据库一般是被公共纳管的,所以我们也可以提供一个回调的API,当被纳管的数据库配置变更时纳管方或者其代理可以回调我们提供的API也能达到上述的目的。
相关文章
- yum升级gcc版本
yum升级gcc版本一、centos7升级gcc版本 4到10二、其它问题1、 其它版本如何安装?2、执行完第三步后发现常用命令失效一、centos7升级gcc版本 4到10 1、安装centos-release-scl yum install centos-release-scl -y2、安装devtoolset yum install devtoolset-10-gc…...
2023/3/28 16:14:16 - JDBC数据库驱动的下载与安装与连接
目录 JDBC数据库驱动下载 Intellij IDEA安装JDBC驱动 在使用 JDBC 之前,需要下载相应的 JDBC 驱动程序,该驱动程序应该与你使用的数据库的版本相对应。可以在数据库官网上找到相应的 JDBC 驱动程序。 JDBC数据库驱动下载 点击官方链接 MySQL :: MySQ…...
2023/3/28 16:13:23 - css设置超出几行显示省略号(单行、多行),兼容数字英文不换行问题,兼容中文字符隔空换行问题
1、单行文本超长显示省略号 /* css */ p{overflow: hidden;/*超出部分隐藏*/text-overflow:ellipsis;/* 超出部分显示省略号 */white-space: nowrap;/*规定段落中的文本不进行换行 */width: 100px;/*需要配合宽度来使用*/ }2、多行文本显示省略号 /* css */ p{ display: -we…...
2023/3/28 16:12:27 - 9、操作系统——线程的相关属性(1)
目录 一、线程相关属性的API 1、线程的特殊属性 2、设置线程的属性 3、注意事项 二、线程属性变量的使用步骤 三、相关的API 1、pthread_attr_init/pthread_attr_destroy(初始化、销毁线程属性变量) 2、pthread_attr_setdetachstate、pthread_attr_getdetachstate&…...
2023/3/28 16:10:17 - README.md文件生成目录结构里的树形内容分布结构
README.md文件生成目录结构里的树形内容分布结构 目的:获取目录与文件的关系结构图,如下图所示:前期准备:安装依赖使用treer命令生成目录结构其他方式README.md文件所在的路径如下: 目的:获取目录与文件的关系结构图,如下图所示: 前期准备: 去官网下载Node.js并安装…...
2023/3/28 16:08:51 - 数据库(做题)
该文章不适合学习数据库,适合考证,遇到实际问题的,不要在这儿浪费时间。切记切记 软考之数据库一、概念数据模型(下午题常考)二、结构数据模型关系模型1、关系模型中基本术语2、关系模型中的关系完整性约束3、关系代数…...
2023/3/28 16:06:18 - 欧拉数(自然对数底e)的推导史
欧拉数的推导史(自然对数底e) (The History of the Derivation of Euler’s Number) 摘要 本文按时间顺序(chronological)总结了许多鼓舞人心的(inspiring)辛勤工作的数学家的作品,他们在数学领域辛勤耕耘,带来了欧拉数的收获,也被称为Nap…...
2023/3/28 16:03:24 - 聚类算法层次聚类
###cluster.py #导入相应的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt #生成待聚类的数据点,这里生成了20个点,每个点4维: pointsscipy.randn(20,4) #加一…...
2023/3/28 16:02:44 - 详解HTTP请求与响应基础及实例
详解HTTP请求与响应基础及实例 一、HTTP的请求与响应 二、HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求 一、HTTP的请求与响应 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本…...
2023/3/28 15:59:53 - 面试准备2023
C基础 面向过程 1,关键字 Static: https://blog.csdn.net/weixin_44966641/article/details/122149739 const: https://blog.csdn.net/qq_40337086/article/details/125519833 2,指针与引用 *&的使用: https://b…...
2023/3/28 15:56:54 - GORM 基础 -- CRUD 接口(二)
1、Update 1.1 保存所有字段 Save将在执行update SQL时保存所有字段 db.First(&user)user.Name "jinzhu 2" user.Age 100 db.Save(&user) // UPDATE users SET namejinzhu 2, age100, birthday2016-01-01, updated_at 2013-11-17 21:34:10 WHERE id111…...
2023/3/28 15:56:43 - 强引用和弱引用区别
强引用 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: Object strongReference new Object();当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会…...
2023/3/28 15:56:18 - 磁盘空间不足怎么办?4招快速清理空间
案例:磁盘空间不足怎么办? “家人们看看我!我的电脑使用了不到两年,现在总是显示磁盘空间不足,有时候想保存些文件都无法保存,遇到这种情况我应该怎么清理我的磁盘呢?快给我出出主意吧ÿ…...
2023/3/28 15:55:49 - linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
1. PATH: 可执行程序的查找路径 查看当前环境变量: echo $PATH 设置: 方法一: export PATHPATH:/XXX 但是登出后就失效 方法二:修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile 1. 在其中添加例如export PATH/opt/ActivePython-2.7/bin:$…...
2023/3/28 15:52:45 - 特斯拉的操作系统是用什么语言编写的?
总目录链接>> AutoSAR入门和实战系列总目录 文章目录特斯拉车辆操作系统特斯拉GitHub中使用的语言Ruby和GoPythonSwift 和 Objective CQt我们知道操作系统至少需要一些非常低级的代码,这些代码在系统首次启动时运行,必须使用接近硬件的语言编写。…...
2023/3/28 15:51:58 - Boot Loader
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS…...
2023/3/28 15:50:51 - Go与Re2正则
Golang支持Re2正则标准(实际上并不支持全部,只是Re2语法的子集),本文介绍一些Golang正则支持语法的解释。 1、Regex Flags 1、贪婪和非贪婪: 正则匹配的时候一个个字符向后找。贪婪就是即使已经匹配了还会尝试向后找…...
2023/3/28 15:50:40 - 电子拣货标签13代系统简介
CK_Label_v13一、产品参数 1. 电池供电版 产品型号 CK_Label_v13 尺寸 70x34.7x13.6mm 屏幕尺寸 2.1 inch 分辨率 250*122 像素密度 130dpi 显示技术 电子墨水屏显示 显示颜色 黑/白 外观颜色 黑色 按键 1 指示灯 1 RGB灯 灯光颜色 7种(红/绿/蓝/黄/紫/白…...
2023/3/28 15:49:24 - Ubuntu下安装和编译onnxruntime
onnxruntime是一种用于onnx格式的机器学习模型的高性能推理引擎,适用于Linux,Windows、Mac及嵌入式设备。这篇博客记录了编译onnxruntime的步骤及在此过程种遇到的问题及解决方法。1 下载git clone --depth 1 --branch v1.12.1 --recursive https://gith…...
2023/3/28 15:47:54 - Asp.net core 依赖注入 (带案例以及注释理解)
1.很多朋友不知道什么是依赖注入,接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少组件之间的耦合度。它的核心思想是,将组件之间的依赖关系从…...
2023/3/28 15:47:43 - Java分布式锁面试题
1.为什么需要分布式锁? public synchronized void test() {System.out.println("获取到锁"); } public void test2() {synchronized (Test.class) {System.out.println("获取到锁");} }假设我们把上述代码部署到多台服务器上,这个互斥锁还能生…...
2023/3/28 15:46:29 - 微信小程序-微信小程序登录流程(一)
微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用 冷启动: 小程序首次打开或销毁后再次被打开&…...
2023/3/28 15:43:29 - C++初级教程(三)
一、C的一维数组 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量,而是声明一个数组变量,比如 …...
2023/3/28 15:42:13 - Github上得分最高的20个项目
freeCodeCamp:一个流行的编程教育平台,目标是让任何人都能够免费学习编程。 Vscode:一个流行的跨平台文本编辑器,支持各种语言和框架,可通过扩展进行自定义。 React:一个流行的 JavaScript 库,…...
2023/3/28 15:41:28 - 【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式
一、通过HashMap实现缓存 这种方式可以简单实现本地缓存,但是实际开发中不推荐使用,下面我们来实现一下这种方式。 首先创建一个管理缓存的类 public class LocalCache {public static HashMap<String,String> cache new HashMap<>();sta…...
2023/3/28 15:37:22 - 从应用火到股市 AIGC概念股连涨仨月
AI有变革生产力之势,证券市场闻风而动。同花顺数据显示,AIGC概念指数年内上涨近60%,涨幅是上证指数的10倍多。 具体到个股,软通动力、远大智能等搭上AI风口的企业服务商“老树发新芽”,直接涨停。游戏板块霸榜产品回报…...
2023/3/28 15:37:03 - linux突破git clone下载限制
前言 本人要在linux下载一个2.5G的文件,但只有20kb/s,实在忍受不了,最终利用工具实现了800kb/s的速度,除了利用工具的方法,本人都尝试了,但是几乎没有效果,我也会罗列出来,可自行尝试…...
2023/3/28 15:36:50 - x86架构利用docker去编译arm64的应用程序
文章目录1. 交叉编译:toolchain2. 隔离挂载的方式:3. QEMU 或其他模拟器来实际运行dockerx86架构实现多平台系统代码的编译,实现方式有多种:交叉编译:toolchain 【新的第三方库不好处理】隔离挂载的方式 【速度慢&…...
2023/3/28 15:33:40 - Apache Camel
目录儿一、简介二、核心总结一、简介 Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. Camel 是一个开源的集成框架,能够让开发者快速、轻松地整合/集成不同的应…...
2023/3/28 15:33:26 - Java学习记录
阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!! 文章目录阅读前请看一下:我是一…...
2023/3/28 15:32:34
最新文章
- yum升级gcc版本
yum升级gcc版本一、centos7升级gcc版本 4到10二、其它问题1、 其它版本如何安装?2、执行完第三步后发现常用命令失效一、centos7升级gcc版本 4到10 1、安装centos-release-scl yum install centos-release-scl -y2、安装devtoolset yum install devtoolset-10-gc…...
2023/3/28 16:14:16 - JDBC数据库驱动的下载与安装与连接
目录 JDBC数据库驱动下载 Intellij IDEA安装JDBC驱动 在使用 JDBC 之前,需要下载相应的 JDBC 驱动程序,该驱动程序应该与你使用的数据库的版本相对应。可以在数据库官网上找到相应的 JDBC 驱动程序。 JDBC数据库驱动下载 点击官方链接 MySQL :: MySQ…...
2023/3/28 16:13:23 - css设置超出几行显示省略号(单行、多行),兼容数字英文不换行问题,兼容中文字符隔空换行问题
1、单行文本超长显示省略号 /* css */ p{overflow: hidden;/*超出部分隐藏*/text-overflow:ellipsis;/* 超出部分显示省略号 */white-space: nowrap;/*规定段落中的文本不进行换行 */width: 100px;/*需要配合宽度来使用*/ }2、多行文本显示省略号 /* css */ p{ display: -we…...
2023/3/28 16:12:27 - 9、操作系统——线程的相关属性(1)
目录 一、线程相关属性的API 1、线程的特殊属性 2、设置线程的属性 3、注意事项 二、线程属性变量的使用步骤 三、相关的API 1、pthread_attr_init/pthread_attr_destroy(初始化、销毁线程属性变量) 2、pthread_attr_setdetachstate、pthread_attr_getdetachstate&…...
2023/3/28 16:10:17 - README.md文件生成目录结构里的树形内容分布结构
README.md文件生成目录结构里的树形内容分布结构 目的:获取目录与文件的关系结构图,如下图所示:前期准备:安装依赖使用treer命令生成目录结构其他方式README.md文件所在的路径如下: 目的:获取目录与文件的关系结构图,如下图所示: 前期准备: 去官网下载Node.js并安装…...
2023/3/28 16:08:51 - 数据库(做题)
该文章不适合学习数据库,适合考证,遇到实际问题的,不要在这儿浪费时间。切记切记 软考之数据库一、概念数据模型(下午题常考)二、结构数据模型关系模型1、关系模型中基本术语2、关系模型中的关系完整性约束3、关系代数…...
2023/3/28 16:06:18 - 欧拉数(自然对数底e)的推导史
欧拉数的推导史(自然对数底e) (The History of the Derivation of Euler’s Number) 摘要 本文按时间顺序(chronological)总结了许多鼓舞人心的(inspiring)辛勤工作的数学家的作品,他们在数学领域辛勤耕耘,带来了欧拉数的收获,也被称为Nap…...
2023/3/28 16:03:24 - 聚类算法层次聚类
###cluster.py #导入相应的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt #生成待聚类的数据点,这里生成了20个点,每个点4维: pointsscipy.randn(20,4) #加一…...
2023/3/28 16:02:44 - 详解HTTP请求与响应基础及实例
详解HTTP请求与响应基础及实例 一、HTTP的请求与响应 二、HttpServletRequest和HttpServletResponse对象获取HTTP响应和请求 一、HTTP的请求与响应 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本…...
2023/3/28 15:59:53 - 面试准备2023
C基础 面向过程 1,关键字 Static: https://blog.csdn.net/weixin_44966641/article/details/122149739 const: https://blog.csdn.net/qq_40337086/article/details/125519833 2,指针与引用 *&的使用: https://b…...
2023/3/28 15:56:54 - GORM 基础 -- CRUD 接口(二)
1、Update 1.1 保存所有字段 Save将在执行update SQL时保存所有字段 db.First(&user)user.Name "jinzhu 2" user.Age 100 db.Save(&user) // UPDATE users SET namejinzhu 2, age100, birthday2016-01-01, updated_at 2013-11-17 21:34:10 WHERE id111…...
2023/3/28 15:56:43 - 强引用和弱引用区别
强引用 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下: Object strongReference new Object();当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会…...
2023/3/28 15:56:18 - 磁盘空间不足怎么办?4招快速清理空间
案例:磁盘空间不足怎么办? “家人们看看我!我的电脑使用了不到两年,现在总是显示磁盘空间不足,有时候想保存些文件都无法保存,遇到这种情况我应该怎么清理我的磁盘呢?快给我出出主意吧ÿ…...
2023/3/28 15:55:49 - linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
1. PATH: 可执行程序的查找路径 查看当前环境变量: echo $PATH 设置: 方法一: export PATHPATH:/XXX 但是登出后就失效 方法二:修改~/.bashrc或~/.bash_profile或系统级别的/etc/profile 1. 在其中添加例如export PATH/opt/ActivePython-2.7/bin:$…...
2023/3/28 15:52:45 - 特斯拉的操作系统是用什么语言编写的?
总目录链接>> AutoSAR入门和实战系列总目录 文章目录特斯拉车辆操作系统特斯拉GitHub中使用的语言Ruby和GoPythonSwift 和 Objective CQt我们知道操作系统至少需要一些非常低级的代码,这些代码在系统首次启动时运行,必须使用接近硬件的语言编写。…...
2023/3/28 15:51:58 - Boot Loader
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS…...
2023/3/28 15:50:51 - Go与Re2正则
Golang支持Re2正则标准(实际上并不支持全部,只是Re2语法的子集),本文介绍一些Golang正则支持语法的解释。 1、Regex Flags 1、贪婪和非贪婪: 正则匹配的时候一个个字符向后找。贪婪就是即使已经匹配了还会尝试向后找…...
2023/3/28 15:50:40 - 电子拣货标签13代系统简介
CK_Label_v13一、产品参数 1. 电池供电版 产品型号 CK_Label_v13 尺寸 70x34.7x13.6mm 屏幕尺寸 2.1 inch 分辨率 250*122 像素密度 130dpi 显示技术 电子墨水屏显示 显示颜色 黑/白 外观颜色 黑色 按键 1 指示灯 1 RGB灯 灯光颜色 7种(红/绿/蓝/黄/紫/白…...
2023/3/28 15:49:24 - Ubuntu下安装和编译onnxruntime
onnxruntime是一种用于onnx格式的机器学习模型的高性能推理引擎,适用于Linux,Windows、Mac及嵌入式设备。这篇博客记录了编译onnxruntime的步骤及在此过程种遇到的问题及解决方法。1 下载git clone --depth 1 --branch v1.12.1 --recursive https://gith…...
2023/3/28 15:47:54 - Asp.net core 依赖注入 (带案例以及注释理解)
1.很多朋友不知道什么是依赖注入,接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少组件之间的耦合度。它的核心思想是,将组件之间的依赖关系从…...
2023/3/28 15:47:43 - Java分布式锁面试题
1.为什么需要分布式锁? public synchronized void test() {System.out.println("获取到锁"); } public void test2() {synchronized (Test.class) {System.out.println("获取到锁");} }假设我们把上述代码部署到多台服务器上,这个互斥锁还能生…...
2023/3/28 15:46:29 - 微信小程序-微信小程序登录流程(一)
微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用 冷启动: 小程序首次打开或销毁后再次被打开&…...
2023/3/28 15:43:29 - C++初级教程(三)
一、C的一维数组 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量,而是声明一个数组变量,比如 …...
2023/3/28 15:42:13 - Github上得分最高的20个项目
freeCodeCamp:一个流行的编程教育平台,目标是让任何人都能够免费学习编程。 Vscode:一个流行的跨平台文本编辑器,支持各种语言和框架,可通过扩展进行自定义。 React:一个流行的 JavaScript 库,…...
2023/3/28 15:41:28 - 【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式
一、通过HashMap实现缓存 这种方式可以简单实现本地缓存,但是实际开发中不推荐使用,下面我们来实现一下这种方式。 首先创建一个管理缓存的类 public class LocalCache {public static HashMap<String,String> cache new HashMap<>();sta…...
2023/3/28 15:37:22 - 从应用火到股市 AIGC概念股连涨仨月
AI有变革生产力之势,证券市场闻风而动。同花顺数据显示,AIGC概念指数年内上涨近60%,涨幅是上证指数的10倍多。 具体到个股,软通动力、远大智能等搭上AI风口的企业服务商“老树发新芽”,直接涨停。游戏板块霸榜产品回报…...
2023/3/28 15:37:03 - linux突破git clone下载限制
前言 本人要在linux下载一个2.5G的文件,但只有20kb/s,实在忍受不了,最终利用工具实现了800kb/s的速度,除了利用工具的方法,本人都尝试了,但是几乎没有效果,我也会罗列出来,可自行尝试…...
2023/3/28 15:36:50 - x86架构利用docker去编译arm64的应用程序
文章目录1. 交叉编译:toolchain2. 隔离挂载的方式:3. QEMU 或其他模拟器来实际运行dockerx86架构实现多平台系统代码的编译,实现方式有多种:交叉编译:toolchain 【新的第三方库不好处理】隔离挂载的方式 【速度慢&…...
2023/3/28 15:33:40 - Apache Camel
目录儿一、简介二、核心总结一、简介 Camel is an Open Source integration framework that empowers you to quickly and easily integrate various systems consuming or producing data. Camel 是一个开源的集成框架,能够让开发者快速、轻松地整合/集成不同的应…...
2023/3/28 15:33:26 - Java学习记录
阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量。文章设置为仅粉丝可见,是因为写博客确实花了不少精力。希望互相进步谢谢!! 文章目录阅读前请看一下:我是一…...
2023/3/28 15:32:34