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是局部的,即通过系数向量和基函数分别对数据中不同位置的节点区域进行拟合,需要计算出全部节点域的拟合函数的参数。而传统的最小二乘是全局的,采用所…

二分法php

二分法。分别使用while循环的方法和递归调用的方法。 <?php// 二分法的使用数组必须是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 递归调用&#xff08;相比较好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块

题目描述 Dpstr最近迷上了推冰块。冰地是一个n行m列的网格区域&#xff0c;第i行第j列的格子记为(i,j)&#xff0c;也就是左上角为(1,1)&#xff0c;右下角为(n,m)。每个格子可能是冰面、障碍物、减速带三者之一。其中&#xff0c;冰地外围&#xff08;即第0行、第n1行、第0列、…

【图像处理面试题】——1

链接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、给定0-1矩阵&#xff0c;求连通域。2、写一个函数&#xff0c;求灰度图的直方图。3、写一个均值滤波&#xff08;中值滤波&#xff09;。4、写出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT运维服务管理问题总结 #F#

1.管理现状问题&#xff1a;支撑企业业务运行的IT系统主要由大量的网络设备、主机系统和应用系统组成&#xff0c;这些设备和系统从应用角度来分又属于不同的业务系统和部门&#xff0c;网络设备、主机系统等具备独立的用户管理、认证授权和审计系统&#xff0c;且由不同的系统…

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

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

MATLAB调用Python自定义函数(类、函数等) Python调用MATLAB

一、MATLAB调用Python函数 参考链接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎链接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上这位说的更加的详细&#xff0c;感谢 二、Python调用MATLAB-API 知乎链接&#xff1a;htt…

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

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

iOS:真机调试

真机调试现在发生了改变&#xff0c;在Xcode7以前进行真机调试是需要证书的&#xff0c;正是由于这个原因&#xff0c;这个过程比较麻烦&#xff1b;在Xcode7以后是免证书的&#xff0c;使用起来就简单很多了。 Xcode7以前的步骤如下&#xff1a; 原链接地址为&#xff1a;http…

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

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

C++总结笔记(十三)—— 类型转换

文章目录一、类型转换简介二、示例1.隐式类型转换2.强制类型转换一、类型转换简介 C中类型转换从形式上可分为显式和隐式两种。 隐式类型转换则是由编译器自动完成类型转换过程&#xff0c;可以分为内置数据类型转换和自定义数据类型转换。 显式的类型转换通常使用强制类型转…

【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 头疼&#xff0c;找了一上午都没有找到这个的路径&#xff0c;最后还是在评论区看到的&#xff0c;这也不能怪人家…

mysql语句大全

1、说明&#xff1a;创建数据库CREATE DATABASE database-name2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开始 备份B…

【翻译】在Ext JS和Sencha Touch中创建自己定义布局

原文&#xff1a;Creating Custom Layouts in Ext JS and Sencha Touch布局系统是Sencha框架中最强大和最独特的一部分。布局会处理应用程序中每个组件的大小和位置&#xff0c;因而&#xff0c;不须要手动去管理那些碎片。Ext JS与Sencha Touch的布局类有很多类似之处。近期在…

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

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

[设计模式]中介者模式之Events消息传递实现

这篇文章比较短,修改自 写给大家看的设计模式之中介者中的例子中介者模式的定义和目的自不必说, 参考上文即可. 本文针对实现方式做一个补充. 中介者模式增加了一个第三方对象(中介者)来控制两个对象(同事)间的交互. 有助于对彼此通信的解耦, 毕竟他们并不需要关心对方的实现细…

【pyqt5】 读取numpy arrray 显示图片

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

[Django]SE项目回忆录(二)-注册/登录功能的实现及细节

该项目中提供了注册和登录两部分功能&#xff0c;功能描述如下&#xff1a; 注册&#xff1a; 允许任何用户进行学生身份的注册。 教师用户预先已经保存在数据库中&#xff0c;不允许以游客身份注册新的教师用户。 注册时需要填写的信息包括&#xff1a; - 用户名 - 密码(…

Zip4j开源jar包的简单使用

因为对项目突然要发送压缩加密的邮件附件&#xff0c;所以从网上看了一些资料说Zip4j开源框架比较好使&#xff0c;对中文的支持也比较好&#xff0c;所以从网上找了一个代码案例&#xff01;自己写了一写&#xff0c;现在贴出来&#xff0c;方便以后想用的时候好找 1、 1 pack…

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

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