窥看 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 ...
随机推荐
- 利用python和shell脚本生成train.txt的标签文件
1. 用shell脚本生成带绝对路径的train.txt 例如我要生成如下形式的带标签的文件,如图:(如有两个标签:0 和 1) shell脚本如下: 这样标签0写入了train.txt # /usr ...
- Salesforce的翻译工作台
翻译工作台 Salesforce提供了翻译工作台.在这里管理员可以对各种数据进行翻译设置,包括对象信息.字段信息.验证规则.错误信息等. 翻译工作台集中了翻译的内容,从而使得管理员或开发者不需要在其他 ...
- pymongo的用法
先看一下官方给出的简单例子,涵盖了大部分内容: >>> import pymongo >>> client = pymongo.MongoClient(" ...
- VS 函数,方法上方 引用等显示
VS有一个这个功能贼好用,喜欢的可以打开看看哦,特别是团队开发,有惊喜哦!
- 常用DOS命令之通俗易懂篇
目录 常用DOS命令之通俗易懂篇 Arp 命令 Assoc 关联 At 计划服务 Attrib 属性 Cd=chdir 目录 Cipher Cls 清屏 Color 颜色 Comp 比较 Compac ...
- nginx ssl 自签证书实验
两台服务器 11.11.11.3 (生成证书然后到CA服务上注册) 11.11.11.4 (nginx服务.CA证书签发) 1.建立CA服务器(11.3) .在CA上生成私钥文件 在/e ...
- SQL Server 链接服务器连接 SQLite数据库文件
SQL Server数据库允许通过数据库驱动程序连接各类数据库并进行操作.以下是在SQL Server 2012 R2中建立SQLite的链接服务器. 一.下载SQLite数据库的ODBC驱动程序: ...
- 英语初级学习系列-00-Name-介绍自己
1. 询问名字 常用句子 1. Hi, may I have your name, please? 2. Could you please tell me your name? 3. Will it ...
- python 在windows下的 虚拟环境
解决 python 环境问题 windows 下安装 pip install virtualenv virtualenv的基本使用 1.1 创建虚拟环境 virtualenv venv 为环境指定Py ...
- luogu P4718 【模板】Pollard-Rho算法(贴代码)
嘟嘟嘟 从标题中能看出来,我只是想贴一个代码. 先扯一会儿. 前几天模拟考到了这东西,今天有空就学了一下. 到网上找资料,发现前置技能是miller-rabin筛法,于是我还得先学这么个东西. 学mi ...