窥看 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即可,下面是一个参考配置文件。

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 
  3 
  4 <configuration debug="false">
  5 
  6 
  7    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
  8 
  9 
 10    <springProperty scope="context" name="APP_PORT" source="server.port"/>
 11 
 12 
 13    <springProperty scope="context" name="DEFAULT_APP_PORT" source="spring.application.port"/>
 14 
 15 
 16    <property name="OS_NAME" value="${os.name}"/>
 17 
 18 
 19    <if condition='property("OS_NAME").contains("Windows")'>
 20 
 21 
 22        <then>
 23 
 24 
 25            <property name="LOG_PATH" value="${LOG_PATH:-E:/logs}" />
 26 
 27 
 28        </then>
 29 
 30 
 31        <else>
 32 
 33 
 34            <property name="LOG_PATH" value="${LOG_PATH:-/log}" />
 35 
 36 
 37        </else>
 38 
 39 
 40    </if>      
 41 
 42 
 43    <property name="LOG_DIR" value="${APP_NAME:-system}" />
 44 
 45 
 46    <property name="APP_PORT" value="${APP_PORT:-${DEFAULT_APP_PORT:-0}}" />
 47 
 48 
 49    <if condition='!property("APP_PORT").equals("0")'>
 50 
 51 
 52        <then>
 53 
 54 
 55            <property name="LOG_DIR" value="${LOG_DIR}-${APP_PORT}" />
 56 
 57 
 58        </then>
 59 
 60 
 61    </if>
 62 
 63 
 64    <!-- 控制台输出 -->
 65 
 66 
 67    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 68 
 69 
 70        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
 71 
 72 
 73            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符 -->
 74 
 75 
 76            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
 77 
 78 
 79        </encoder>
 80 
 81 
 82    </appender>
 83 
 84 
 85    <!-- 按照每天生成日志文件 -->
 86 
 87 
 88    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
 89 
 90 
 91        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
 92 
 93 
 94            <level>INFO</level>
 95 
 96 
 97        </filter>
 98 
 99 
100        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
101 
102 
103            <!--日志文件输出的文件名 -->
104 
105 
106            <FileNamePattern>${LOG_PATH}/${LOG_DIR}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
107 
108 
109            <!--日志文件保留天数 -->
110 
111 
112            <MaxHistory>30</MaxHistory>
113 
114 
115        </rollingPolicy>
116 
117 
118        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
119 
120 
121            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
122 
123 
124            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
125 
126 
127        </encoder>
128 
129 
130        <!--日志文件最大的大小 -->
131 
132 
133        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
134 
135 
136            <MaxFileSize>10MB</MaxFileSize>
137 
138 
139        </triggeringPolicy>
140 
141 
142    </appender>
143 
144 
145    <!-- 按照每天生成日志文件 error级别 -->
146 
147 
148    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
149 
150 
151        <filter class="ch.qos.logback.classic.filter.LevelFilter">
152 
153 
154            <level>ERROR</level>
155 
156 
157            <onMatch>ACCEPT</onMatch>
158 
159 
160            <onMismatch>DENY</onMismatch>
161 
162 
163        </filter>  
164 
165 
166        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
167 
168 
169            <!--日志文件输出的文件名 -->
170 
171 
172            <FileNamePattern>${LOG_PATH}/${LOG_DIR}/error.log.%d{yyyy-MM-dd}.log</FileNamePattern>
173 
174 
175            <!--日志文件保留天数 -->
176 
177 
178            <MaxHistory>30</MaxHistory>
179 
180 
181        </rollingPolicy>
182 
183 
184        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
185 
186 
187            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
188 
189 
190            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
191 
192 
193        </encoder>
194 
195 
196        <!--日志文件最大的大小 -->
197 
198 
199        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
200 
201 
202            <MaxFileSize>10MB</MaxFileSize>
203 
204 
205        </triggeringPolicy>
206 
207 
208    </appender>
209 
210 
211    <!--myibatis log configure -->
212 
213 
214    <logger name="com.apache.ibatis" level="TRACE" />
215 
216 
217    <logger name="java.sql.Connection" level="DEBUG" />
218 
219 
220    <logger name="java.sql.Statement" level="DEBUG" />
221 
222 
223    <logger name="java.sql.PreparedStatement" level="DEBUG" />
224 
225 
226    <!-- 日志输出级别 -->
227 
228 
229    <root level="INFO">
230 
231 
232        <appender-ref ref="STDOUT" />
233 
234 
235        <appender-ref ref="FILE" />
236 
237 
238        <appender-ref ref="FILE-ERROR" />
239 
240 
241    </root>
242 
243 
244 </configuration>
logback-spring.xml

八:启动全过程解析

  

图片来自(https://blog.csdn.net/Growing_stu/article/details/82585817)

 

转载于:https://www.cnblogs.com/nullering/p/9943704.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值