窥看 SpringBoot 的原理与使用

一:SpringBoot的启动

1. 继承spring-boot-starter-parent项目

窥看 SpringBoot 的原理与使用

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

窥看 SpringBoot 的原理与使用

二: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 注解自定义你的行为,不过这不是推荐的做法。

窥看 SpringBoot 的原理与使用

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注解读取方式

窥看 SpringBoot 的原理与使用

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

窥看 SpringBoot 的原理与使用

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},访问更多不同对象的数据请点击参考官方定义。

窥看 SpringBoot 的原理与使用

六:单元测试

添加 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

八:启动全过程解析

  窥看 SpringBoot 的原理与使用

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

上一篇:第2阶段——编写uboot之启动内核和制作Makefile(2)


下一篇:[cocos2d-x][apk打包][Fatal signal 11][andriod]Eclipse编译Fatal signal 11报错-都是字符赋值惹的祸