2019独角兽企业重金招聘Python工程师标准>>>

本文会通过分析上一篇中跑起来的示例程序来分析一下Spring Boot程序运行的基本原理。

概要

在上一篇的介绍中,程序是通过SpringBoot1HelloworldApplication.main()方法运行起来的:

public static void main(String[] args) {SpringApplication.run(SpringBoot1HelloworldApplication.class, args);
}

从代码中可以看到,通过SpringApplication.run ,这样一个静态方法,非常便捷地启动了一个Spring程序。SpringApplication这个类实际上就是一个Spring Boot应用的起点,每一个Spring Boot的应用都会有一个类似的启动类,而run方法的实际的作用是初始化了一个Spring容器的上下文。下面我们来分析一下这个简单的应用是如何启动起来的。

思考

按照以往使用Spring Framework的经验,初始化一个Spring容器,需要读取一些配置信息,但是在我们这个示例程序里面是没有做任何配置的,先看一下源码。

源码分析

从SpringApplication.run()方法一路追踪,看到下面的一个运行的过程:

上面的源码最下面的红框中在加载META-INF下面的spring.factories文件,然后我们看到有很几个包里面都带这个文件,我们主要关注一下spring-boot-autoconfigure这个包下面的。

大致内容示例如下:

可以看出,这个文件基本上都是定义一些InitializerListener这些定义都会在SpringApplication。run启动的时候进行加载。这些内容加载之后有什么用呢,以上图中红框对应的org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration 进行举例说明,先看一下该类的源码:

简单理解一下这个类上的几个注解:

  • @Configuration 本类是一个Spring的配置类
  • @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) 类路径中有注解中的两个类则加载本配置
  • @EnableConfigurationProperties(RabbitProperties.class) 加载注解类中对应的配置类

到这里我们大概就知道了这个spring.factories 配置文件其实就是定义了一些Spring启动需要的监听以及Spring Boot 启动是的默认配置,这样就能达到在不做任何配置的情况下,启用Spring Boot提供的默认配置来启动程序。

SpringApplication运行及自动配置总结

简单总结一下:

  1. 每个Spring Boot 程序都包括一个main函数来运行SpringApplication.run(),进行系统启动。(目前可以这么认为)
  2. 这个run方法里面会初始化一个Spring的容器,初始化的内容都在项目及各个jar文件的META-INF下面的spring.factories中定义的各个配置类、监听等等。
  3. 每个自动配置类都是基于条件进行加载的,即我们在项目中引入某些包之后,不添加配置或者少量必需配置后即可使用该包的功能。

欢迎关注我的微信公众号:

转载于:https://my.oschina.net/lsjcoder/blog/1585346

Spring Boot实践教程(二):SpringApplication分析相关推荐

  1. Spring Boot入门教程(二十八): 校验(validation)

    validation主要是校验用户提交的数据的合法性,比如是否为空,密码是否符合规则,邮箱格式是否正确等等,校验框架比较多,用的比较多的是hibernate-validator, 也支持国际化,也可以 ...

  2. Spring Boot入门教程(二十五): Apache Shiro

    1. pom.xml shiro并没有提供对应的Starter,而是使用的shiro-spring,其它的依赖都是辅助 <dependency><groupId>org.spr ...

  3. Spring Boot:(二)启动原理解析

    Spring Boot:(二)启动原理解析 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏. ...

  4. springboot 创建地址_这可能是史上最易懂的 Spring Boot 入门教程

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  5. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  6. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

  7. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践--AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  8. Spring Boot入门教程(四十):微信支付集成-刷卡支付

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 一:准备工作 使用微信支付需要先开通服务号,然后还要开通微信支付,最后还要配置一些开发参数,过程比较多. 申请服务号(企业 ...

  9. Spring Boot 基础教程:集成 Knife4j

    前言 之前介绍了如何在 Spring Boot 中集成 Swagger2 和 Swagger3,对于我们日常的接口管理已经够用了.但是作为一个颜值党,无论是 Swagger2 还是 Swagger3, ...

最新文章

  1. debian 10 静态ip配置
  2. 2018微信年度数据报告:00后最爱表情捂脸哭 80后呲牙笑
  3. xcode8 matlab,Xcode8 iOS App上传详细流程
  4. nofollow标签_如何Nofollow外链
  5. CT一般扫描参数_CT图像质量参数
  6. Python 之 字典(dict)的创建、字典生成式、复制添加更新删除、查询遍历比较等
  7. SQL注入——判断注入
  8. 配置IDEA运行环境
  9. 西门子1200plc与施耐德变频器modbus通讯程序
  10. 硅谷华人天才CEO被开除,是否会有奇迹发生?
  11. 计算机主机放电操作,如何给主板CMOS放电的3种方法图文教程
  12. 微信公众号文章如何设置关键词自动回复链接
  13. linux 添加sbit权限,Linux特殊权限SUID、SGID、SBIT
  14. 南陵中学2021高考成绩查询,南陵中学举行2021届高三距高考200天动员大会
  15. tc ebpf sample - tethering offload on linux pc
  16. python多个文件夹合并成一个文件夹
  17. 音视频入门系列-音频篇(AAC)
  18. 高等工程热力学复习04
  19. 通过JS定义一个Iframe
  20. 3_使用seurat sct方法中的reference based处理大数据超过100000个细胞 science advance

热门文章

  1. webcomponents安装了没有用_Web Components 入门实例教程
  2. 安卓ps2模拟器_安卓PSP模拟器评测:合金装备 和平步行者
  3. 电源芯片选择DC/DC还是LDO?《转》
  4. cmd窗口快速定位到具体文件夹方法
  5. Android调试技巧之Eclipse行号和Logcat
  6. WinForm给ComboBox增加Value(转)
  7. javascript-排序算法
  8. css获取到指定元素的宽度,在回调返回宽度值
  9. RHEL7 USB installation problem and solving
  10. hihocoder 二分