springboot数据源浅析
DataSourceAutoConfiguration分析
SpringBoot有一个自动配置DataSourceAutoConfiguration 为数据源配置
/META-INF/spring.factories文件找到DataSourceAutoConfiguration配置类
一、先来看下DataSourceAutoConfiguration配置类生效的时机,观察源码发现
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
在springboot下只有EmbeddedDatabaseType类型是爆红,说明没有相关依赖引入,而它属于spring-jdbc依赖,那么加上(从spring-boot-starter-data-jdbc里面复制的)
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.1.RELEASE</version><scope>compile</scope>
</dependency>
此时重启项目发现容器中已经有org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 即此时DataSourceAutoConfiguration生效,但是它仅仅是DataSourceAutoConfiguration这个类被注入容器,要想自动配置数据源
还需要让EmbeddedDatabaseConfiguration或PooledDataSourceConfiguration生效
当引入下面依赖时可以去掉spring-jdb因为spring-boot-starter-data-jdbc里面引入了spring-jdb依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
DataSourceAutoConfiguration 就会触发自动配置
配置生效时机参考传送门
题外话spring-boot-starter-jdbc 和 spring-boot-starter-data-jdbc 的区别
一、你会发现spring-boot-starter-data-jdbc 依赖下面有spring-boot-starter-jdbc和spring-data-jdbc
而spring-data-jdbc引入了spring-data-commons 其中CrudRepository接口提供了基础增删改查,该接口就在spring-data-commons中。
二、springboot默认的数据源是HikariDataSource,HikariCP依赖位于spring-boot-starter-jdbc下。
上面测试用到的
依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency></dependencies>
测试类MyBatisPlusBootMain
@SpringBootApplication
public class MyBatisPlusBootMain implements CommandLineRunner, ApplicationContextAware {Logger logger = LoggerFactory.getLogger(MyBatisPlusBootMain.class);@Autowired(required = false)DataSource dataSource;private ApplicationContext applicationContext;public static void main(String[] args) {ApplicationContext run = SpringApplication.run(MyBatisPlusBootMain.class, args);UsersEntity user01 = run.getBean("user01", UsersEntity.class);System.out.println(user01);DataSourceAutoConfiguration dataSourceAutoConfiguration = run.getBean("org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration", DataSourceAutoConfiguration.class);System.out.println(dataSourceAutoConfiguration);}@Overridepublic void run(String... args) throws Exception {System.out.println(">>>>>>>>>>>>>>>>>服务启动执行");showConnection();showIOCBean();}private void showIOCBean() {String[] names = this.applicationContext.getBeanDefinitionNames();for (int i = 0; i < names.length; i++) {System.out.println(names[i]);}}private void showConnection() throws SQLException {logger.info("dataSource:{}", dataSource.getClass().getName());Connection connection = dataSource.getConnection();logger.info("connection:{}", connection.toString());}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}
}
yml
spring:datasource:url: jdbc:mysql://localhost:3306/testusername: rootpassword: 3306
更换默认的数据源改为DruidDataSource
参考:传送门
方法一:
添加依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.23</version>
</dependency>
yml
spring:datasource:url: jdbc:mysql://localhost:3306/bms_testusername: rootpassword: 3306type: com.alibaba.druid.pool.DruidDataSource
此时数据源更改为DruidDataSource
方法二:
1 、添加druid依赖
2、创建DataSource的bean,进行相关配置后,返回DruidDataSource
@Beanpublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl("jdbc:mysql://localhost:3306/bms_test");dataSource.setUsername("root");dataSource.setPassword("3306");return dataSource;}
多数据源配置
相关文章:
springboot数据源浅析
DataSourceAutoConfiguration分析 SpringBoot有一个自动配置DataSourceAutoConfiguration 为数据源配置 /META-INF/spring.factories文件找到DataSourceAutoConfiguration配置类 一、先来看下DataSourceAutoConfiguration配置类生效的时机,观察源码发现 Configura…...
2022黑马Redis跟学笔记.实战篇(七)
2022黑马Redis跟学笔记.实战篇 七4.11.附近的店铺功能4.11.1. GEO数据结构的基本用法1. 附近商户-导入店铺数据到GEO4.11.2. 获取附近的店铺1. 附近商户-实现附近商户功能4.9. 签到功能4.9.1.BitMap原理1. 用户签到-BitMap功能演示4.9.2.实现签到功能4.9.3.实现补签功能4.9.4.统…...
QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等
QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等框架搭建UI设计mp3.hmp3.cpp隐藏窗口标题 最大化 最小化 关闭框架搭建 .pro添加 # 网络 添加多媒体 数据库 QT network multimedia sql添加头…...
硬件学习 软件Cadence day04 PCB 封装绘制
1.文章内容: 1. 贴片式电容 PCB 封装绘制 (型号 c0603 ) 2. 贴片式电阻 PCB 封装绘制 (型号 r0603 ) 3. 安规式电容 PCB 封装绘制 (这个就是 有一个电容,插入一个搞好的孔里面 …...
【Java】yield()和join()区别
一、java 线程调度的背景 java虚拟机要求在多线程中实现 preemptive和priority-based调度,这意味着java中每一个线程被分配了特定的优先级,正整数在定义好的范围内不断减。优先级可以通过开发者改变但是java虚拟机从不改变线程的优先级,即使…...
【MySQL】Java连接MySQL数据库(封装版只需会MySQL)
一、准备普通项目如果创建的是普通的Java项目,我们需要去maven仓库下载jdbc驱动包然导入项目中就能使用,具体步骤详见MySQL数据库之Java中如何使用数据库【JDBC编程】maven项目如果创建的项目是maven项目,我们只需在pom.xml文件里引入一组依赖…...
【java基础】运算符
运算符 operator 运算符优先级 Operators 操作员Precedence 优先级postfix 后缀expr expr--unary 一元的expr --expr expr -expr ~ !multiplicative 〔数〕乘法的 / %additive 添加剂 -shift 移动<< >> >>>relational 关系的< > < > insta…...
带噪学习-概述
在实际应用的时候,我们的样本不会是完全干净的,即存在噪声样本。那使用存在噪声的样本时,我们如何更有效的进行模型学习呢?Label Dependent Nose样本选择(Sample Selection)第一种很直接的想法,…...
Scratch少儿编程案例-多彩打地鼠
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
为什么拔掉计算机网线还能ping通127.0.0.1?
前言 当我们在计算机上拔掉网线之后,发现我们仍然可以使用ping命令来ping通本机的IP地址127.0.0.1,这让很多人感到困惑,认为拔掉网线后计算机就无法与外界通信了,为什么还能ping通本机的IP地址呢? 本文的目的是通过对…...
Android kotlin 内、外部存储根目录及测试(可以实现仿微信未读消息数提示数字)
<<返回总目录 文章目录 一、内部存储与外部存储三、外部存储的写读测试(可以实现仿微信未读消息数提示数字)一、内部存储与外部存储 所有Android设备都有两个文件存储区域:内部存储空间(internal Storage)和外部存储空间(external Storage)。所以,Android系统从逻…...
Android 7.0 OTA升级(高通)
文章目录1. Full OTA 方式升级介绍1.1 Full OTA 制作第一步:生成 msm89xx-target_files-eng.XXX.zip1.2 Full OTA 制作第二步:Modem 等非 HLOS 加入升级包的方法1.3 Full OTA 制作第三步:生成 update.zip 升级包2. Incremental OTA 方式升级介…...
工作负载之DeployMent
DeployMent 无状态工作负载(Deployment):即kubernetes中的“Deployment”,无状态工作负载支持弹性伸缩与滚动升级,适用于实例完全独立、功能相同的场景,如:nginx、wordpress等。 也是公司中应…...
淘宝tmall页面数据获取,API接口对接程序
item_get-获得淘宝商品详情请求参数请求参数:num_iid652874751412&is_promotion1参数说明:num_iid:淘宝商品IDis_promotion:是否获取取促销价响应参数Version: Date:2022-04-04名称类型必须示例值描述itemitem[]1宝贝详情数据num_iidBigint152081325…...
基于粒子群优化算法的电动汽车充放电V2G研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
java并发编程原理2 (AQS, ReentrantLock,线程池)
一、AQS: 1.1 AQS是什么? AQS就是一个抽象队列同步器,abstract queued sychronizer,本质就是一个抽象类。 AQS中有一个核心属性state,其次还有一个双向链表以及一个单项链表。 首先state是基于volatile修饰&#x…...
研报精选230219
目录 【行业230219山西证券】煤炭行业周报:复工改善,港口价格企稳反弹【行业230219中航证券】农林牧渔行业周观点:一号文件落地,生物育种超势不改【行业230219华西证券】汽车行业周报:新车密集上市 自主转型提速【个股…...
【PPPoE】PPPoE拨号流程
简介 PPPoE(Point-to-Point Protocol over Ethernet)是一种在以太网上封装PPP协议的方式,常用于在宽带接入中进行拨号。 PPPoE的拨号原理如下: 客户端发起PPPoE Active Discovery Initiation (PADI)报文,广播到网络…...
django项目实战(django+bootstrap实现增删改查)
目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…...
Lesson4---Python语言基础(2)
4.1 内置数据结构 4.1.1 序列数据结构(sequence) 成员是有序排列的每个元素的位置称为下标或索引通过索引访问序列中的成员Python中的序列数据类型有字符串、列表、元组 “abc” ≠ “bac” 4.1.1.1 创建列表和元组 Python中的列表和元组,…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
