Spring Boot实践教程(二):SpringApplication分析

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

本文会通过分析上一篇中跑起来的示例程序来分析一下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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PCL的MLS(移动最小二乘)算法简介与示例

一、MLS基础 mls算法本质上和最小二乘一样,是一种拟合数据的算法。区别在于mls是局部的,即通过系数向量和基函数分别对数据中不同位置的节点区域进行拟合,需要计算出全部节点域的拟合函数的参数。而传统的最小二乘是全局的,采用所…

基于PCL的RANSAC(随机采样一致)算法简介与示例

前言 RANSAC(Random sample consensus,随机采样一致)是3D点云拟合的一种重要的手段,可以对直线、圆、平面,圆球、圆柱等形状的点云进行拟合,其优点在于可以最大程度上减少噪声点对拟合效果的影响。 一、RA…

Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场

Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场 2014/10/14 Testin 业界资讯(中国北京–2014年10月14日 )全球最大的移动游戏、应用真机和用户云測试平台Testin云測今日宣布与ARM建立战略伙伴合作关系,设立“ARM应…

正则表达式快速入门,转载

正则表达式快速入门 首先简单介绍下正则表达式: 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 下面就看看正则表达式里…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件转py文件及no Qt platform plugin could be initialized 问题解决】

目录 一、寻找designer.exe 二、no Qt platform plugin could be initialized 问题解决 三、ui文件转换为py文件 四、pyqt5的使用教程 一、寻找designer.exe 头疼,找了一上午都没有找到这个的路径,最后还是在评论区看到的,这也不能怪人家…

PCL中GreedyProjection三角化算法简介与示例

文章目录前言一、PCL点云三角化1.1 Delaunay三角剖分1.2 贪婪三角化二、程序示例总结前言 Delaunay三角剖分最初应用于2维领域,而与Greedy三角化算法的结合,使之成为目前在三维重建领域最为基础的算法原理之一,很多学者针对其原理进行改进用…

【pyqt5】 读取numpy arrray 显示图片

目录 1、GUI界面(QT designer设计) 2、逻辑函数(回调等) 3、显示图片在label上 0)直接利用QPixmap显示图像 1)显示彩色图 彩色图显示色调不正常——opencv(BGR)QT(RGB)需要进行…

【pyqt5】——入门级模板(ui文件+ui转py文件+逻辑py文件)(消息提示框)

目录 1、ui文件 2、ui转py文件 3、逻辑py文件 4、实例 1)ui文件——demo.ui 2)ui转py文件——demo.py 3)逻辑py文件——demoLogic.py 4)运行结果 1、ui文件 这个文件是直接通过pyqt5 designer进行设计的,相关配置可见《配置Qt Design…

PCL中点特征描述子PFH、FPFH和VFH简述和示例

文章目录前言一、点特征直方图1.1 PFH1.1.1 法线估计1.1.2 特征计算1.2 FPFH1.3 VFH二、示例2.1 PFH计算2.2 FPFH2.3 VFH前言 点特征直方图是PCL中非常重要的特征描述子,在点云匹配、分割、重建等任务中起到关键作用,可以对刚体变换、点云密度和噪声均有…

来一个炫酷的导航条

本文分享一个带动画效果的中英文切换导航条。 鼠标放上去试一下&#xff1a; INDEX 首页 BBS 社区 HOME 我 1.用CSS3实现 效果看上去复杂&#xff0c;其实我们先来做出一个样式&#xff0c;就很简单了。如下&#xff1a; 代码&#xff1a; <nav><ul class"list…

EXCEL小技巧:如何统计非空单元格

http://club.excelhome.net/thread-1187271-1-1.html 下面教大家如果用函数统计非空单元格的数量 首先我们来介绍几个统计函数&#xff1a; 1.COUNT(value1,value2,...) 统计包含数字的单元格个数 2.COUNTA(value1,value2,...) 统计非空单元格的个数 3.COUNTBLANK(range&…

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。

报错信息&#xff1a; 解决方案&#xff1a; 1、“设置应用程序池默认属性”/“常规”/”启用32位应用程序”&#xff0c;设置为 true。 如下图所示&#xff1a;&#xff08;已测试&#xff0c;好使&#xff09; 方法二&#xff1a;生成->配置管理器->平台->点击Any C…

008. 限制上传文件的大小

第一种方法: 利用web.config的配置文件项, 进行设置; 前端aspx示例: <% Page Language"C#" AutoEventWireup"true" CodeFile"sendOutEmail.aspx.cs" Inherits"sendOutEmail" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHT…

浙江中医药大学第十一届程序设计竞赛题解

官方题解&#xff1a;http://www.jnxxhzz.com/Article/article/9.html 2019: 特产 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 548 Solved: 154[Submit][Status][Web Board]Description Input Output 输出一个整数表示dd带回来的特产重量 Sample Input 2 3 6 1 3Sample …

【项目实战】——USB双路继电器电脑控制灯的开关(Python)

环境&#xff1a;window10、Python3.7.9 依赖库&#xff1a;pyserial 硬件&#xff1a;220V灯带、220V吊灯、USB双路继电器、电笔 1、安装Python第三方库pyserial 2、清楚插座的零火线&#xff08;用电笔去测试&#xff0c;灯亮为火线&#xff09; 3、清楚灯的零火线&#…

字符串去掉空格

2019独角兽企业重金招聘Python工程师标准>>> String s1s.trim().replaceAll("\\s*", ""); 转载于:https://my.oschina.net/u/2842177/blog/1587850

基于CMake构建MSVC_CUDA及MinGW编译环境下的的OpenCV项目

前言 第一次搭建OpenCV开发环境的时候各种报错&#xff0c;内心那个烦啊&#xff0c;简直了。当时只能针对某个特定的错误去寻找特定的解决方法&#xff0c;在OpenCV构建过程中出现最多的问题就是各个模块文件的下载问题&#xff0c;本质上这类问题的解决思路都是一样的&#…

【opencv】——钢管计数(霍夫圆变换 + 阈值 + canny)

目录 方法一:霍夫圆变换 + canny 方法二 阈值 + 寻边 对图中的钢管进行计数 方法一:霍夫圆变换 + canny

DNS域传送漏洞

0x00 相关背景介绍 Dns是整个互联网公司业务的基础&#xff0c;目前越来越多的互联网公司开始自己搭建DNS服务器做解析服务&#xff0c;同时由于DNS服务是基础性服务非常重要&#xff0c;因此很多公司会对DNS服务器进行主备配置而DNS主备之间的数据同步就会用到dns域传送&#…

封装之--通过类中公有方法访问私有成员变量

如何在ClassB中访问ClassA的私有成员变量&#xff1f;&#xff08;典型的封装案例&#xff09; 通过在ClassA中定义公有的成员方法&#xff0c;然后&#xff0c;在ClassB中通过ClassA的对象调用ClassA中的公有方法&#xff0c;来访问ClassA中的私有成员变量。 转载于:https://w…