Spring Boot源码剖析

一.Spring Boot 项目的启动入口流程分析

  Spring Boot项目的启动入口main线程上有一个@SpringBootApplication( @Configuration + @EnableAutoConfiguration + @ComponentScan )注解, 表明是主配置类, 让程序自动识别并进行必要的配置

  项目启动后, 首先进行自动配置, 源码如下:

---在org.springframework.boot.autoconfigure 包下有一个接口实现类:  AutoConfigurationImportSelector

public class AutoConfigurationImportSelector
implements ... {
...try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);

...
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
}

  通过SpringFactoriesLoader扫描默认的资源路径( 源码如下 ), 返回  List<String> configurations (我的项目中, 97个配置项), 在经过一系列方法处理后, 留下必要的配置( 23个 ), 随后经历一个重要的 Spring框架的类的方法, 逐步部署项目, 即 AbstractApplicationContext 类的 refresh() 方法.

public abstract class SpringFactoriesLoader {
...
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
...
}

ps: 不妨在自己的SpringBoot项目中找到这个类, 在红色代码( 创建候选配置集合 )处添加断点, debug启动来跟进SpringBoot的加载过程.

二.Spring Boot 启动时如何加载各种框架配置类? 举例: Mybatis

  1. springboot启动时, 通过扫描到的注解 @EnableConfigurationProperties(MybatisProperties.class) 加载了mybatis框架配置类: MybatisAutoConfiguration

  2. 查看mybatis框架的配置类

public class MybatisAutoConfiguration {

  private final MybatisProperties properties;
... @Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
...
}

  3. 查看mybatis的详细配置信息

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
public class MybatisProperties { public static final String MYBATIS_PREFIX = "mybatis";
...
}

  4. 查看mybatis-spring-boot-autoconfigure.jar 包下的 META-INF 资源路径

三.自研mybatis-demo框架与Spring Boot整合

  1. 分析: 自研框架的jar包, 需要哪些核心类?

类比Mybatis, 需要的核心类, 有 SqlSessionFactory,

  MybatisAutoConfiguration,

  SqlSessionFactory method..(),

  MybatisProperties.

  2.创建项目 demo-mybatis, 项目结构如下, 进行maven install 打成 jar包, 模拟框架的发布

  项目源码地址见本篇博文尾部, 欢迎指正!

  3. 新建SpringBoot项目, 添加SpringMvc依赖, 即 boot-web-starter

    ① 引入我们打好的demo-mybatis 自研框架的 jar 包

    依赖如下:

<dependency>
<groupId>com.demo</groupId>
<artifactId>demo-mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

    ②  编辑Controller    

@RestController
public class DemoController {
@Autowired
SqlSessionFactory sessionFactory; @RequestMapping("/demo-mybatis")
public String demo() {
return sessionFactory.getSqlSession();
}
}

    ③ 修改yml文件自定义 框架的配置属性

com:
demo:
mybatis:
hello: hi!
world: new world!

    ④ 启动项目, 会看到控制台输出了自研框架内的"假"信息:

    ⑤ 访问测试地址: http://localhost:8080/demo-mybatis

    访问成功!!!

  就这样, 我们剖析了SpringBoot的加载原理, 并仿造Mybatis框架, 自研了一个demo框架, 并整合到SpringBoot项目中!!!

源码地址, 可以参考我的GitHub: https://github.com/93LifeAfterLife/Demo-Mybatis

欢迎交流指正~

学习SpringBoot整合SSM三大框架源码之SpringBoot的更多相关文章

  1. 整合ssm三大框架使用注解开发查询用户信息

    整合ssm三大框架使用注解开发查询用户信息 一.基础知识准备之spring mvc工作原理 二.分析 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求Hand ...

  2. java 快速开发平台 有代码生成器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  3. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  4. java 快速开发框架平台 二次开发 代码生成器 springmvc SSM后台框架源码

    官网 http://www.fhadmin.org/D 集成安全权限框架shiro  Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安全,更可靠E ...

  5. SSM 三大框架系列:Spring 5 + Spring MVC 5 + MyBatis 3.5 整合(附源码)

    之前整理了一下新版本的 SSM 三大框架,这篇文章是关于它的整合过程和项目源码,版本号分别为:Spring 5.2.2.RELEASE.SpringMVC 5.2.2.RELEASE.MyBatis ...

  6. SpringMVC详解(四)------SSM三大框架整合之登录功能实现

    为了后面讲解的需要,我们取数据都会从数据库中获取,所以这里先讲讲三大框架(Spring.SpringMVC.MyBatis)的整合.前面讲解 MyBatis 时,写了一篇 MyBatis 和 Spri ...

  7. SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)【转】

    使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...

  8. SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)(转)

    使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...

  9. SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)

    使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没 ...

随机推荐

  1. Fibonacci数性质

    Fibonacci数性质 0.\(F_{n-1}+F_{n-2}=F_{n} ,特殊的 F_{0}=1,F_{1}=1\) 上述式子为定义式 1.\(F_{0}+F_{1}+...+F_{n}=F_{ ...

  2. 总结 1121 Java面向对象

    总结 Java面向对象的基础 三大特征: 封装(抽象),继承,多态 面向对象的内存分析: 栈, 堆, 代码区, 静态区 this: 代表当前对象本身 有时候需要把当前调用对象进行传递,那么就可以使用t ...

  3. 评估类模型之优劣解距离法Topsis模型

    定义: TOPSIS法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距. 层次分析法的局限性: 问题和解决方案: 所以最终评分公式为: 指标正向化,得到正向 ...

  4. 【基础算法-ST表】入门 -C++

    前言 学了树状数组看到ST表模板跃跃欲试的时候发现完全没思路,因为给出的查询的时间实在太短了!几乎是需要完成O(1)查询.所以ST表到底是什么神仙算法能够做到这么快的查询? ST表 ST表是一个用来解 ...

  5. parents()和parent()

    $("").parent().parent()  //父元素的父元素 $("").parents("tr")  // 祖先元素 找到tr

  6. MySQL 5.7 GTID OOM bug案例分析 --大量压测后主从不同步

    转载自:http://www.sohu.com/a/231766385_487483 MySQL 5.7是十年内最为经典的版本,这个观点区区已经表示过很多次.然而,经典也是由不断地迭代所打造的传奇.5 ...

  7. Subsequence (POJ - 3061)(尺取思想)

    Problem A sequence of N positive integers (10 < N < 100 000), each of them less than or equal ...

  8. 在centos7上使用packstack安装openstack

    简介 Packstack主要是由Redhat推出的用于概念验证(PoC)环境快速部署的工具.Packstack是一个命令行工具,它使用Python封装了Puppet模块,通过SSH在服务器上部署Ope ...

  9. UVALive 4254 Processor ——(二分+优先队列处理)

    题目是求最小化最大值,很显然是二分,但是二分以后怎么判断mid是否可行并不容易. 代码参考了网上一个博客的代码.巧妙之处在于一秒一秒的考虑,这样可以把处理速度mid直接转化成1秒内实际的量来解决(避免 ...

  10. 【转】CAtlRegExp class .

    CAtlRegExp Class   CAtlRegExp 类用于表示并处理正则表达式.模板类,定义如下:     template < class CharTraits = CAtlRECha ...