3、SpringBoot解密第一篇

SpringBoot解密第一篇

一、感受SpringBoot Starter

1、SpringBoot特性的优点有哪些?

引用官方:
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.

  • Create stand-alone Spring applications
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
    使创建一个基于Spring的应用很简单
  • Provide opinionated ‘starter’ dependencies to simplify your build configuration
    Starter简化依赖配置
  • Automatically configure Spring and 3rd party libraries whenever possible
    自动配置
  • Provide production-ready features such as metrics, health checks and externalized configuration
  • Absolutely no code generation and no requirement for XML configuration
    零XML配置

2、对比:如果不使用SpringBoot,搭建一个SSM工程需要多久?

1、加入相关的jar包
2、配置web.xml,加载spring和是spring mvc
3、配置数据库连接、配置spring事务
4、配置加载配置文件的读取,开启注释
5、配置日志文件

配置完成之后部署tomcat调试

需要步骤和配置很多,期间还会碰到很多问题,其中难点是什么?

  • 包依赖
  • bean配置

这些是不是必需做的?SpringBoot中,这些是不是starter帮我们做了?

解决问题的办法:Starter

  • starter引入相关的jar
  • starter自动完成bean配置

二、SpringBoot Starter 如何自动添加依赖包的?

按步骤来解读spring-boot-starter-parent内部奥密。
步骤一

  • 新SpringBoot项目的POM文件都继承了spring-boot-starter-parent,点击parent标签spring-boot-starter-parent,可打开spring-boot-starter-parent的POM文件
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述

步骤二

  • 查看spring-boot-starter-parentPOM文件,可以得知,
    springboot自动对properties配置文件,做了一些默认配置,如:JDK默1.8、编码默认UTF-8,同时自动加载resources目录的配置文件,如:application.yml、application.yaml、application.properties文件
    在这里插入图片描述
    在这里插入图片描述

步骤三

  • 继续打开spring-boot-starter-parentPOM文件的parent标签的spring-boot-dependencies,可点击进入spring-boot-dependencies的POM文件。
    从spring-boot-dependenciesPOM文件,我们读取到大量依赖包maven信息,而且依赖包固化了版本号,所以我们使用parent标签方法继承spring-boot-starter-parentPOM文件,就等于在项目中自动添加了图中所有依赖包。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、SpringBoot Starter 如何自动处理依赖关系的?

以mybatis为例子,解读如何mybatis集成springboot,与datasource如何建立关系的?

步骤一

  • 添加springboot对第三方mybatis的集成包,mybatis-spring-boot-starter
    在这里插入图片描述
    步骤二
  • 在maven依赖包中找到mybatis-spring-boot-starter架包,打开POM文件
    在这里插入图片描述

步骤三

  • mybatis-spring-boot-starterPOM文件列出的依赖包,如下
// springboot
org.springframework.boot.spring-boot-starter
// springboot jdbc
org.springframework.boot.spring-boot-starter-jdbc
// springboot autoconfigure
org.mybatis.spring.boot.mybatis-spring-boot-autoconfigure
//mybatis原生包
org.mybatis.mybatis
//mybatis spring 集成包
org.mybatis.mybatis-spring

在这里插入图片描述
在这里插入图片描述

步骤四

  • springboot能与mybatis实现自动依赖,关键就在mybatis-spring-boot-autoconfigure这个架包上,在maven依赖包找到它,如图所示,
    在这里插入图片描述

步骤五

  • 查看MybatisAutoConfiguration这个类,通过构造器实现对象注入,然后,我们重点看下此类上的注解。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUKbdhft-1572190489082)(index_files/312f527e-7bcd-43d2-bd3e-1f9c3bbb85a3.png)]

步骤六

  • 解读MybatisAutoConfiguration类上的注解
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})

@ConditionalOnClass
表示SqlSessionFactory、SqlSessionFactoryBean这两个类都存在时,才加载这个配置
@ConditionalOnBean 表示DataSource这个bean对象在spring容器存在时,才加载这个类配置
@EnableConfigurationProperties 这个类自动装配时,把mybatis配置文件加载,并自动注入spring容器
@AutoConfigureAfter 等DataSourceAutoConfiguration自动注入后,才加载这个类配置

SqlSessionFactory和SqlSessionFactoryBean在spring容器,已经存在,关键要看@DataSourceAutoConfiguration是如何实现自动注入的。

步骤七

  • 解读DataSourceAutoConfiguration类上的注解
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wES5sfUW-1572190489083)(index_files/ac9a4c89-bad5-4961-a7e7-0d88fa9f1efc.png)]

步骤八

  • 打开import注释导入的DataSourcePoolMetadataProvidersConfiguration类,进一步解读
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    从源码中,可以看出,dbcp2和tocat连接池,在项目类路径下都不存在,只有HikariDataSource可以。由此可见,springboot2采用HikariDataSource作为默认连接池。Hikari与dbcp2、tomcat、cp03、BoneCP等连接池比较,无论是速度、稳定、体积等指标上都完胜。

总结:
1、DataSourcePoolMetadataProvidersConfiguration类的内部类HikariPoolDataSourceMetadataProviderConfiguration配置类自动注入spring 容器
2、DataSourceAutoConfiguration配置类,满足DataSource接口类、EmbeddedDatabaseType枚举类存在,import外部导入 DataSourcePoolMetadataProvidersConfiguration类后,实现自动装配bean
3、MybatisAutoConfiguration配置类,满足SqlSessionFactory、SqlSessionFactoryBean类存在,DataSourceAutoConfiguration自动装配后,也实现自动装配bean

四、SpringBoot Starter 的bean需要的参数,是如何规定并获取的?

还是以mybatis为例子,控索mybatis配置文件和datasource配置文件,如何自动注入的。

  • 1、application.yml中mybatis.mapper-locations,mybatis.config-location与MybatisProperties类中的属性相对应,其它属性也全都对应
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 2、spring.datasource.url,spring.datasource.username,spring.datasource.password与DataSourceProperties类中的属性相对应,其它属性也全都对应
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

五、SpringBoot Starter 的bean是如何被发现并自动装配的?

1、解读入口类@SpringBootApplication注解

@SpringBootApplication 是SpringBoot 的核心注解,它是一个组合注解,源码如下:
在这里插入图片描述
@SpringBootApplication 注解主要组合了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan、@ConfigurationPropertiesScan四个注解。
@SpringBootConfiguration其实就是特殊的@Configuration注解,
@ComponentScan、@ConfigurationPropertiesScan为类文件扫描和配置参数文件自动扫描,那么@EnableAutoConfiguration是干什么的?

2、解读@EnableAutoConfiguration注解

步骤一
请在maven依赖包中找到spring-boot-autoconfigure包META-INF目录下的spring.factories文件打开,看到很多类似配置文件的键值结构。
找到#Auto Configure注释下,org.springframework.boot.autoconfigure.EnableAutoConfiguration自动注入配置类,信息类太多,下面我们以mybatis为例子。
在这里插入图片描述
在这里插入图片描述

步骤二
在maven依赖包中找到mybatis-spring-boot-autoconfigure包META-INF目录下的spring.factories文件打开
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:
spring.factories中的键值结构,值中除了有逗号分隔符外,还有/,/其实就是一个换行符,因为一行太长不好展示。

总结:

@SpringBootApplication组合注解类中包含 @EnableAutoConfiguration注解类。@EnableAutoConfiguration则是扫描项目中所有META-INF下面的spring.factories文件,如果该文件有org.springframework.boot.autoconfigure.EnableAutoConfiguration这个类的配置,则会将键值结构的值(值为扫描类的逗号分隔的拼装),加入扫描中。是不是感觉so easy?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值