今天学习springboot中数据源配置时想到一些问题:

  • 仅配置mysql的username、password、url时,springboot会默认使用连接池管理数据连接源吗?
    为了解惑,直接在当前项目下(已配置mysql、mybatis可以顺利访问数据库)写了个启动初始化类:
@Component
@Log4j2
public class InitRunner implements CommandLineRunner {@Autowiredprivate DataSource dataSource;@Overridepublic void run(String... args) throws Exception {log.error("当前所用数据库连接池为:"+dataSource);}
}


可以看到,默认不对数据源加任何配置情况下,springboot(2.x版本)默认会使用HikariDataSource。作为新手很高兴,没配置也用上了,暗自窃喜。可是上面的案例中,又产生了几个疑问:

疑问1:为什么DataSource可以自动装配

我的简单理解:springboot默认提供HikariDataSource数据连接池,这意味着项目启动时便会创建对应的bean实例,通过HikariDataSource实例化DataSource,所以可以直接注入。

疑问2:DataSource什么时候产生实例bean的

使用@Autowired来注入DataSource时,编译器可以检测到是否可以注入的。一个空白项目——新建springboot项目,只加入springboot-starter与web依赖是无法注入该实例的(编译不通过),为什么上例可以直接注入?

最开始想到的是与mybatis有关,比如我使用了@Mapper注解?,亦或是我使用了JPA的@Table注解,springboot扫描到相关注解时候产生?
自己进行了一些测试:

  1. 把当前项目的@Mapper或@MapperScan或@Table等等与DAO层相关注解全匿了,发现还是能正常产生HikariDataSource实例;
  2. 于是又把@Service相关注解也匿了,还正常输出;
  3. 此时的我陷入了沉思…
  4. 思路错了,既然是编译时检测,肯定与注解无关了,,,毕竟项目启动时才会解析注解
  5. 重新建了个空sprinboot项目,先把InitRunner放进去,加入mysql的配置项,及mysql驱动jar包,发现InitRunner代码检测未通过
  6. 然后引入mybatis依赖
  7. 代码检测通过了…
    当然这里只是编译通过,实际产生实例还是在运行时产生,至于为什么引入依赖就可编译通过嘛(我还没找到对应源码),其实这有点像你不配置HikariDataSource就可以使用差不多的道理(DataSource自动装配原理),只要你引入了该依赖,springboot会默认给你加载该数据源,实际上spring是有@ConditionalOnClass(xxx.class)这种注解的,其作用在某个XXX类上,当xxx.class类存在时,XXX类才会实例化bean,所以引入了相应的jar包,也就能检测到所需类是存在的。
疑问3:为什么HikariDataSource (null)

到底HikariDataSource是否为null,测试一下:

@Overridepublic void run(String... args) throws Exception {log.error("当前所用数据库连接池为:"+dataSource);System.out.println(dataSource);System.out.println("数据源是否为null:"+dataSource==null);}


结果返回false,debug一下,发现有数值

springboot中DataSource数据源实例产生时机及所需环境相关推荐

  1. springboot中druid数据源配置无效的问题和jar包找不到问题

    springboot中druid数据源配置无效的问题 阿里云的仓库 链接: 阿里云仓库. 自己在springboot项目中,引入druid的依赖,希望引入druid数据源. 但是idea中,虽然在这个 ...

  2. SpringBoot中多数据源的配置

    1.场景还原 在实际项目中,一个工程配置多个数据源很常见,工程可能会根据业务或者模块访问不同的数据库或表:今天笔者就springboot中配置多数据源作个详细的讲解 2.实现方案 注意:一个应用工程中 ...

  3. SpringBoot中注入RedisTemplate实例异常解决

    https://blog.csdn.net/zhaoheng314/article/details/81564166 最近,在项目开发过程中使用了RedisTemplate,进行单元测试时提示&quo ...

  4. Spring AOP及其在SpringBoot中的使用

    一.前言 本文简单介绍了Spring Aop的思想,以及部分基础概念,并且附带两个SpringBoot中简单的实例. 本文章中使用的环境及版本: 开发工具:Intellij IDEA 2017.3.4 ...

  5. Java笔记-对SpringBoot中CommandLineRunner的使用笔记

    从中可以看到,这个是SpringBoot中的一个接口,他是在Spring环境都建起了后,一个一个的调用,都是在主线程中调用,如下: 事例代码如下: DisposeOne.java @Component ...

  6. SpringBoot中扩展SpringMVC

    在我们一般的SpringBoot中,实现页面的跳转只需写一个controller,在上面加上注解 package com.hzy.controller;import org.springframewo ...

  7. 数据源(DataSource)是什么以及SpringBoot中数据源配置

    数据源 数据源,简单理解为数据源头,提供了应用程序所需要数据的位置.数据源保证了应用程序与目标数据之间交互的规范和协议,它可以是数据库,文件系统等等.其中数据源定义了位置信息,用户验证信息和交互时所需 ...

  8. 关于SpringBoot中的多数据源集成

    引言 其实对于分库分表这块的场景,目前市场上有很多成熟的开源中间件,eg:MyCAT,Cobar,sharding-JDBC等. 本文主要是介绍基于springboot的多数据源切换,轻量级的一种集成 ...

  9. SpringBoot中mybatis配置多数据源

    首先需要创建多个数据库 简单的user表 CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAU ...

最新文章

  1. 使用DPM2007备份还原Exchange2007邮箱数据库
  2. OpenGL_Qt学习笔记之_05(纹理映射)(转)
  3. ListView中的图片异步加载、缓存
  4. pfSense修改PPPoE拨号总数
  5. 用小括号表达一个长字符串
  6. php网页微信登录验证失败,php 微信添加分账接收方-验证签名失败
  7. 深入了解这些Java框架,看看哪个更适合你?
  8. [LeetCode] Generate Parentheses
  9. silverlight导出excel
  10. gradle web_简单的Gradle Web应用程序
  11. C++包扩展_利用 MATLAB Coder 将M代码生成C/C++代码
  12. 日志异常处理-spring aop注解
  13. Samsung SENS R60plus
  14. 梦幻西游html源码,index.html
  15. hive优化:大表关联数据倾斜问题
  16. fastlane二开java_iOS中使用Fastlane实现自动化打包和发布
  17. mysql为什么需要中间件_为什么要用数据库中间件
  18. HTML做表格以及注册界面
  19. 流媒体的几种播放方式
  20. virtualbox虚拟机怎么识别U盘

热门文章

  1. 【iOS篇】从容面对App崩溃
  2. China Daily | 技术不是拦路虎:在线音乐教学可完美还原线下场景
  3. Think as developer, 从深入理解业务实现框架开始
  4. Toping Kagglers:Bestfitting,目前世界排名第一
  5. 如何使用Java与Mysql进行数据交互
  6. Oracle 11g Dataguard 物理备库配置(四)之broker snapshot standby测试
  7. 解决9.png malformed以及libpng warning: iCCP
  8. 《Android UI基础教程》——1.2节Android 应用程序的基本结构
  9. NVMe SSD是什么?
  10. PHP中如何给日期加上一个月 加一周 加一天