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这个类,通过构造器实现对象注入,然后,我们重点看下此类上的注解。

步骤六

  • 解读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类上的注解

步骤八

  • 打开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?

3、SpringBoot解密第一篇相关推荐

  1. SpringBoot+Lucene第一篇——引出Lucene

    Lucene的学习第一篇--引出Lucene 一:需求场景提出: 1:在指定(10个)不同名字,不同内容的word文档中,进行任意指定搜索. 比如:搜索哪个文档中有:"高富帅",& ...

  2. SpringBoot:第一篇 新建spring boot 应用

    1.idea 新建spring boot项目 File-> new Project 2.web 应用---选择web应用 3.Controller package com.example.dem ...

  3. springboot springcloud区别_SpringCloud微服务全家桶-第一篇!为什么要用微服务

    从今天开始,学习SpringCloud微服务全家桶. 一.引导 1.什么是微服务? 2.微服务之间是如何独立通讯的 3.springCloud和Dubbo有哪些区别? 4.什么是服务熔断?什么是服务降 ...

  4. 网易换肤第一篇:换肤技术解密!

    参考 脑图:https://note.youdao.com/s/Q1e6r39j 最终效果: Demo源码:点击跳转 技术点分析 换肤的核心思路主要是在setContentView()之前调用setF ...

  5. 公开课 | 解密HW究竟怎么玩?之 第一篇

    HW目的 检测国家关键基础设施与单位备案重要信息系统的安全问题和隐患,检验其事件监测.安全防护与应急处置,快速协同.应急处突的能力. HW目标 涉及的行业众多.范围广泛,包含政府.金融.电力.运营商. ...

  6. SpringBoot SpringBoot 基础篇(第一篇) 第2章 SpringBoot 全局配置 2.2 yaml 文件

    SpringBoot [千锋教育java教程SpringBoot2全套,springboot快速入门到项目实战视频教程] SpringBoot 基础篇(第一篇) 第2章 SpringBoot 全局配置 ...

  7. 下载量已超越千万的爆红游戏2048(同名小3传奇、1024)源代码解密和下载(第一篇)

    一张图告诉你2048有多火 小3的悲剧 在每个阶段手机里面都会有一两款让人爱不释手的游戏存在,无论是在公车上.床铺上.马桶上还是在睡觉前.吃饭前.总会有让你拿出手机打开它的欲望.大部分人被Flappy ...

  8. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  9. 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

    最新Finchley版本请访问: https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 或者 http://blog.csd ...

最新文章

  1. Spring的Hello, world,还有拿来主义
  2. android新闻app_如何利用 Python 爬虫实现给微信群发新闻早报?
  3. [PLL][PM]锁相环模拟相位解调
  4. pcb地线应该不应该做成环路_干货|图文详解EMC的PCB设计技术
  5. 我的手机 不支持箭头函数
  6. 微软中山大学开源超强的视觉位置编码,涨点显著
  7. 团队组成五个基本要素_【记录】综合分部宁波分队团队拓展活动
  8. 数据结构与算法——贪心算法汇总整理
  9. html吃豆豆游戏代码,吃豆豆小游戏
  10. 【aws smart home】Aleax skill环境搭建
  11. 面向大众征集 “故宫·金榜题名”文创众筹大赛启动
  12. 秒解UTF-8带来的烦恼
  13. Windows环境下使用GTK
  14. java中抛出异常之后程序还会继续运行么?
  15. mysql常用汉字库_MYSQL 常用总结【基础】
  16. wow服务器合并信息,《魔兽世界》一区合并服务器正式通告
  17. iPhone 14微信闪退怎么办?iPhone 14微信闪退解决办法分享
  18. thinkpad重装系统不引导_联想ThinkPad T470重装系统U盘无法启动怎么办?进bios设置启动教程...
  19. 蓝牙协议栈消息的关联
  20. 智能驾驶域控制器SoC选型

热门文章

  1. XnView Standard 1.91.1
  2. 如果一百多人在漏水的船上讨价还价谁该往外多舀水
  3. 小明被不明势力劫持。后被扔到x星站再无问津。小明得知每天都有飞船飞往地球,但需 要108元的船 票,而他却身无分文。 他决定在x星战打工。好心的老板答应包食宿,第1天给他1元钱。 并且,以后的每一天都
  4. 自定义列表li项目符号
  5. 解决驱动器或者网络连接不可用
  6. android 属性翻牌动画,android scale实现翻牌动画效果
  7. ElasticSearch系列:elasticsearch+kibana
  8. 全球猎头公司排名 2006
  9. linux学习笔记(10) - vi和vim文字处理器
  10. HTTP RANGE DOS 工具下载