窥看 SpringBoot 的原理与使用
一:SpringBoot的启动
1. 继承spring-boot-starter-parent项目

2. 导入spring-boot-dependencies项目依赖

二:Spring Boot 主类及目录结构介绍
Spring Boot 与传统项目最大的区别是,传统项目都是打成 WAR 包部署到服务器上面,需要额外的 Servlet 容器, 而 Spring Boot 则可以直接打成 jar 包,并内置集成了 Servlet 容器,通过命令 java -jar xx.jar 则可以直接运行,不需要独立的 Servlet 容器。
主入口类:
在主入口类上加上 @SpringBootApplication 注解来开启 Spring Boot 的各项能力,如自动配置、组件扫描等。
这里要说明一下的就是,@SpringBootApplication是Spring Boot的核心注解,主要组合包含了以下3个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。
@EnableAutoConfiguration:打开自动配置的功能。
@ComponentScan:Spring组件扫描。用来代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。
如果你不想这么做,你也可以充分利用 @EnableAutoConfiguration 和@ComponentScan 注解自定义你的行为,不过这不是推荐的做法。

Starter启动器
Starters包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。
Spring Boot官方的启动器都是以 spring-boot-starter-命名的,代表了一个特定的应用类型。
第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的 mybatis-spring-boot-starter。
介绍几种常见的启动器
| 启动器名称 | 功能描述 |
| spring-boot-starter | 包含自动配置、日志、YAML的支持。 |
| spring-boot-starter-web | 使用Spring MVC构建web 工程,包含restful,默认使用Tomcat容器。 |
|
spring-boot-starter-test |
|
| spring-boot-starter-actuator | 提供生产环境特性,能监控管理应用。 |
| spring-boot-starter-json | 提供对JSON的读写支持。 |
| spring-boot-starter-logging | 默认的日志启动器,默认使用Logback。 |
三:配置文件
Spring Boot有两种类型的配置文件,application和bootstrap文件。Spring Boot会自动加载classpath目前下的这两个文件,文件格式为properties或者yml格式。
application配置文件是应用级别的,是当前应用的配置文件。
bootstrap配置文件是系统级别的,用来加载外部配置,如配置中心的配置信息,也可以用来定义系统不会变化的属性。bootstatp文件的加载先于application文件。
开发环境配置(Profile):
Spring Boot可以对不同环境来读取不同的配置文件。
假如有开发、测试、生产三个不同的环境,需要定义三个不同环境下的配置。
建立三个环境下的配置文件(以properties文件为例):
applcation.properties
applcation-dev.properties :开发环境
applcation-test.properties:测试环境
applcation-prod.properties:生产环境
然后在applcation.properties文件中指定当前的环境spring.profiles.active=test,这时候读取的就是application-test.properties文件。
代码中读取配置文件内容:
读取application文件
在application.yml或者properties文件中添加:
info.address=USA info.company=Spring info.degree=high
1:使用@Value注解读取方式

2:使用@ConfigurationProperties注解读取方式

3:读取指定文件
如果使用的不是application.yml或者application.properties文件,则可以用 @PropertySource 注解标注,其他还是使用上面两个注解配置
如:资源目录下建立config/db-config.properties:
则:
@PropertySource(value ={"config/db-config.properties"})
注意的是 @PropertySource 不支持 yml 文件读取
4:加载顺序
三:Spring Boot Server容器
参数配置:
server.xx开头的是所有servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数
spring-boot-starter-web自动携带了tomcat依赖,但也可以替换成jetty和undertow,下面是一个替换jetty的示例。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
启动图案
banner
图案定制网站http://patorjk.com
四:Spring Boot 整合Thymeleaf 模板引擎
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
查看参数源码:
private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
默认的编码是:UTF-8
默认的类型是:text/html
默认的模板文件目录是:classpath:/templates/
默认的模板文件后缀是:.html
这些参数都可以通过在application配置文件中指定 spring.thymeleaf.xx进行更改,更多可参考该参数类。
使用
知道了自动配置的原理,所以我们可以知道怎么做了。
一、在resources目录下创建templates目录。
二、在templates目录下创建.html模板文件。
三、使用模板:
1、模板文件头部使用 <html xmlns:th="http://www.thymeleaf.org"> 定义。
2、html标签上使用 th:开头标识作为前缀。
3、通过 @{}引入web静态文件。
<link rel="stylesheet" th:href="@{/css/jquery.min.css}"/>
4、访问数据
访问springmvc中的model数据: ${user.name},访问更多不同对象的数据请点击参考官方定义。

六:单元测试
添加 Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>1.5.10.RELEASE</version>
<scope>test</scope>
</dependency>
开发只要使用 spring-boot-starter-test 启动器就能引入以下Spring Boot 测试模块
spring-boot-test:支持测试的核心内容。
spring-boot-test-autoconfigure:支持测试的自动化配置。
还能引入一些其他一些有用的类库,具体如下所示:
JUnit:Java 应用程序单元测试标准类库。
Spring Test & Spring Boot Test:Spring Boot 应用程序功能集成化测试支持。
AssertJ:一个轻量级的断言类库。
Hamcrest:一个对象匹配器类库。
Mockito:一个Java Mock测试框架,默认支付 1.x,可以修改为 2.x。
JSONassert:一个用于JSON的断言库。
JsonPath:一个JSON操作类库。
使用
要让一个普通类变成一个单元测试类只需要在类名上加入 @SpringBootTest 和@RunWith(SpringRunner.class) 两个注释即可。
在测试方法上加上 @Test 注释。如果测试需要做 REST 调用,可以 @Autowire 一个 TestRestTemplate。
七:日志集成
使用starters启动器时,Spring Boot将使用Logback作为默认日志框架。spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架。
既然默认自带了Logback框架,Logback也是最优秀的日志框架,往资源目录下创建一个logback-spring.xml即可,下面是一个参考配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<springProperty scope="context" name="APP_PORT" source="server.port"/>
<springProperty scope="context" name="DEFAULT_APP_PORT" source="spring.application.port"/>
<property name="OS_NAME" value="${os.name}"/>
<if condition='property("OS_NAME").contains("Windows")'>
<then>
<property name="LOG_PATH" value="${LOG_PATH:-E:/logs}" />
</then>
<else>
<property name="LOG_PATH" value="${LOG_PATH:-/log}" />
</else>
</if>
<property name="LOG_DIR" value="${APP_NAME:-system}" />
<property name="APP_PORT" value="${APP_PORT:-${DEFAULT_APP_PORT:-0}}" />
<if condition='!property("APP_PORT").equals("0")'>
<then>
<property name="LOG_DIR" value="${LOG_DIR}-${APP_PORT}" />
</then>
</if>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_PATH}/${LOG_DIR}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天生成日志文件 error级别 -->
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_PATH}/${LOG_DIR}/error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--myibatis log configure -->
<logger name="com.apache.ibatis" level="TRACE" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="FILE-ERROR" />
</root>
</configuration>
logback-spring.xml
八:启动全过程解析

图片来自(https://blog.csdn.net/Growing_stu/article/details/82585817)
窥看 SpringBoot 的原理与使用的更多相关文章
- 带着萌新看springboot源码8(spring ioc源码上)
emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...
- 带着萌新看springboot源码05
上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...
- 带着萌新看springboot源码
springboot的功能确实强悍,只需要很少的配置,就能够做出来一个简单的web应用,下面我就简要的分析一下为什么springboot能够起作用. 不觉得很奇怪吗?只需要一个主配置类(就是启动那个m ...
- 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)
@ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...
- 2 — springboot的原理
1.初步探索:第一个原理:依赖管理 发现:这里面存放着各种jar包 和 版本号 这也是:我们在前面第一个springboot项目创建中勾选了那个web,然后springboot就自动帮我们导入很多东西 ...
- SpringBoot启动原理及相关流程
一.springboot启动原理及相关流程概览 springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置.那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 二 ...
- 带着萌新看springboot源码8(spring ioc源码下)
继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...
- SpringBoot底层原理及分析
一,Spring Boot简介 1.什么是Spring Boot: SpringBoot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特 ...
- SpringBoot启动原理
SpringBoot启动原理 我们开发任何一个Spring Boot项目,都会用到如下的启动类: @SpringBootApplication public class Application { p ...
随机推荐
- 【代码笔记】Web-HTML-图像
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 在vue中赋值的路径没有被编译
当我们跑起来的时候,f12会看到相对路径,但是此时会报错,说找不到图片,这时候有其中一个办法,直接 require进去. 这时候就可以成功显示图片,但是路径会不一样,因为编译出来. 至于如何props ...
- Ubuntu 16.04.4 LTS + Ambari 2.6.1.5 + HDP 2.6.4.0 安装部署
服务器 主机名 master slave1 slave2 slave3 IP 192.168.1.40 192.168.1.41 192.168.1.42 192.168.1.43 离线包服务器: 1 ...
- 安卓开发_数据存储技术_sqlite
一.SQLite SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了.SQLite已经被多种软件和产品使用 ...
- [20171218]varchar2(4000)如何保存.txt
[20171218]varchar2(4000)如何保存.txt --//以前写的,不知道为什么被删除了,现在补上. 如果一行能被存储于一个数据块(data block)中,那么其行头(row hea ...
- 洗礼灵魂,修炼python(33)--面向对象编程(3)—特殊类方法__init__,公有属性,私有属性
在上一篇博文里,传入参数时,是在实例化对象后且在调用方法时才传入参数,感觉是不是有点繁琐对吧?可以在实例化的时候就传入参数吗?可以的,这就是本篇博文的要讲到的构造器——__init__(两边双下划线) ...
- SQL Server 中的回滚
USE [TestDB] GO /****** 对象: Table [dbo].[Person] 脚本日期: 11/23/2008 13:37:48 ******/ SET ANSI_NULLS ON ...
- git svn 流程
$ git svn clone http://192.168.10.208/svn/DeptDoc $ git svn rebase $ git commit -asm "svn tra ...
- OffsetDateTime工具类
java8时间API介绍及使用 java7及之前版本,推荐使用jodatimejava8提供的datetime api参考了jodatime 在新的时间API中, Instant表示一个精确的时间点, ...
- popen()/pclose()阻塞性问题验证
背景: popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这个管道必须由pclose()函数关闭,而不是fclose()函数. pclos ...