SpringBoot 2.X集成 jdbc自动配置原理探究

前言
Springboot对于数据访问层,不管是 SQL还是 NOSQLSpring Boot 底层都是采用 Spring Data 的方式统一处理。Spring Data 是 Spring 家族中与 Spring Boot、Spring Cloud 齐名且知名项目。想要更好的了解Sping Data,可以参考Sping Data 官网:https://spring.io/projects/spring-data

事实上,Springboot整合jdbc基本上企业都不会这么去使用,但是为什么要学呢?我为什么又要写这么一篇文章呢?也很简单,就像HelloWorld程序一样的道理,毕竟jdbc是连接数据库最基本的基础,不忘基础,重视基础,不忘初心,方得始终。

1、创建jdbc工程环境

创建的时候勾选WebjdbcMySQL即可,

pom.xml文件默认会有如下依赖:

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

   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <scope>runtime</scope>
   </dependency>

如上搭建好之后,应该怎么写才可以实现数据库的访问呢?实际上SpringBoot中,我们只需要简单的配置就可以实现数据库的连接了;

2、编写配置文件

在application.yml配置文件中,编写jdbc常规配置连接

spring:
  datasource:
    username: root
    url: jdbc:mysql://localhost:3306/ufida
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

在springboot2.X版本中如果spring.datasource.url不指定时区就会报一个SQLException错误

把上面的URL属性添加时区,如下即可:

url: jdbc:mysql://localhost:3306/ufida?serverTimezone=UTC

需要注意一点的是:我现在使用的MySQL是5.7版本:

配置之后就可以直接去使用了,因为SpringBoot已经默认帮我们进行了自动配置!是不是感动到哭?

3、test测试类测试

@SpringBootTest
class JdbcbootApplicationTests {
//第一步:DI注入数据源
    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() throws SQLException {
//第二步:测试代码
        System.out.println("默认使用的数据源:" + dataSource.getClass());

        Connection connection = dataSource.getConnection();
        System.out.println("获取的连接:" + connection);
        connection.close();
    }
}


输出结果可以看到默认给我们配置的数据源为 class com.zaxxer.hikari.HikariDataSource , 我们并没有手动配置,到这里,激起了各位的好奇心~不知道你们好不好奇,反正宜春很好奇~,于是乎全局搜索找到数据源的所有自动配置都在 :DataSourceProperties 文件下,不要问我为啥知道是在这个文件下,给个图你也就和我一样知道了

接下来我们可以来探究下这里自动配置的原理以及能配置哪些属性了

可以看出 Spring Boot 2.2.2 默认使用 com.zaxxer.hikari.HikariDataSource 数据源,而以前版本,比如 Spring Boot 1.5 默认使用 org.apache.tomcat.jdbc.pool.DataSource 作为数据源;至于原因也很简单,听闻HikariDataSource 是当前速度最快的数据源,相比于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加牛皮,因此springboot把它作为默认的数据源了。

既然是自动配置,按照springboot的套路,估计有个DataSourceXXXAutoConfiguration的东东,全局搜索一下,
果不其然,有存在一个DataSourceAutoConfiguration的类,我们就来进去逛逛

无非这个类中就是一些数据源、池什么的自动配置,需要注意一点的就是

可以使用 spring.datasource.type 指定自定义的数据源类型,值要使用连接池实现的完全限定名。默认情况下,它是从类路径自动检测的,源码如下:

    @Configuration
    @ConditionalOnMissingBean({DataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"}
    )
    static class Generic {
        Generic() {
        }

        @Bean
        public DataSource dataSource(DataSourceProperties properties) {
            return properties.initializeDataSourceBuilder().build();
        }
    }

OK,DataSourceAutoConfiguration的源码就看到这,具体的可自行查看。

4、JdbcTemplate自动配置原理

有了数据源HikariDataSource就可以拿到数据库连接java.sql.Connection,有了连接就相当于可以使用连接和原生的 JDBC 语句来操作数据库进行crud,这个点我估计都会想到JdbcTemplate,毕竟好东西都要合理利用!

这里不可以开挂使用第三方数据库操作框架MyBatis,实际上Spring 本身也对原生的JDBC 做了轻量级的封装,没错就是 org.springframework.jdbc.core.JdbcTemplate

既然是自动配置,我们就应该想到JdbcTemplate 的自动配置原理是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 ,不出意料,该包中果然有JdbcTemplateAutoConfiguration 类。如下

5、Springboot集成jdbc之后CRUD测试

既然能使用jdbcTemplate,就使用它得了,千万记得如下自动注入操作即可

@Autowired
JdbcTemplate jdbcTemplate;

至于CRUD代码这里就不再概述了,本篇文章主要探究Springboot集成jdbc自动配置原理。不管学什么框架都不是学会配置,更重要的是思想!

如果本文对你有一点点帮助,那么请点个赞呗,谢谢~

最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!

欢迎各位关注我的公众号,里面有一些java学习资料和一大波java电子书籍,比如说周志明老师的深入java虚拟机、java编程思想、核心技术卷、大话设计模式、java并发编程实战.....都是java的圣经,不说了快上Tomcat车,咋们走!最主要的是一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...

原文地址:https://www.cnblogs.com/yichunguo/p/12162769.html

时间: 2024-10-07 08:54:03

SpringBoot 2.X集成 jdbc自动配置原理探究的相关文章

springboot(八) 嵌入式Servlet容器自动配置原理和容器启动原理

1.嵌入式Servlet容器自动配置原理 1.1 在spring-boot-autoconfigure-1.5.9.RELEASE.jar => springboot自动配置依赖 jar包下,EmbeddedServletContainerAutoConfiguration => 嵌入式servlet容器自动配置类 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplicatio

面试题: SpringBoot 的自动配置原理及定制starter

3.Spring Boot 的自动配置原理 package com.mmall; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] ar

SpringBoot源码分析----(二)SpringBoot自动配置原理

自动配置原理 1.SpringBoot启动的时候加载主配置类,开启了自动配置功能  @EnableAutoConfiguration [email protected] 功能的作用 @AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { 利用  AutoConfigurationImportSelector  给容器

3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 先打包在进行测试 java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc 指定访问的路径 多个配置用空格分开: --配置项=值 -- 由jar包外向jar包

Spring Boot自动配置原理(转)

第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot-autoconfigure工程根目录下.执行 $ tree | grep -c .java$ 模块 java文件数 spring-boot 551 spring-boot-actuator 423 spring-boot-autoconfigure 783 spring-boot-devtools

Spring Boot面试杀手锏————自动配置原理

转:https://blog.csdn.net/u014745069/article/details/83820511 引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架. 当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不

Spring Boot2 系列教程(二十一) | 自动配置原理

微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 这个月过去两天了,这篇文章才跟大家见面,最近比较累,大家见谅下.下班后闲着无聊看了下 SpringBoot 中的自动配置,把我的理解跟大家说下. 配置文件能写什么? 相信接触过 SpringBoot 的朋友都知道 SpringBoot 有各种 starter 依赖,想要什么直接勾选加进来就可以了.想要自定义的时候就直接在配置文件写自己的配置就好.但你们有没有困惑,为什么 SpringBoot 如此智能,到底配置文件里面能写

4、Spring Boot 自动配置原理

1.4 Spring Boot 自动配置原理 简介 spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器.视图解析器.模板引擎 那个这个是怎么实现的呢?原因就在于它利用了Spring的

spring boot 自动配置原理

1).spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration 2).通过@EnableAutoConfiguration中AutoConfigurationImportSelector给容器中导入了一系列的组件通过List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);获取候选的配置,下一步通过SpringFactor