SpringBoot详解

本文详细介绍了SpringBoot的优缺点,强调了其简化配置和快速开发的特点。通过六个章节,逐步讲解了SpringBoot的简介、快速入门、配置文件、原理分析、整合其他技术,以及如何制作自定义starter。内容涵盖了从SpringBoot的基础概念到高级应用,包括配置文件的使用、自动配置原理、Mybatis和Junit的集成等。

学习目标:

  1. 能够理解Spring的优缺点

  2. 能够理解SpringBoot的特点

  3. 能够理解SpringBoot的核心功能

  4. 能够搭建SpringBoot的环境

  5. 能够完成application.properties配置文件的配置

  6. 能够完成application.yml配置文件的配置

  7. 能够使用SpringBoot集成Mybatis

  8. 能够使用SpringBoot集成Junit

第一节 SpringBoot简介

1. Spring优缺点分析

  • 优点分析

  • Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Ordinary Java Object,POJO)实现了EJB的功能。

  • 缺点分析

    • 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。

    • 除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

2. SpringBoot概述

2.1 SpringBoot设计思想

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

2.2 SpringBoot的特点

  • 为基于Spring的开发提供更快的入门体验

  • 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求

  • 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等

  • SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式

2.3 SpringBoot 四大神器

  • 起步依赖(Starter)

    起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

  • 自动配置(AutoConfig)

    Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

  • 命令行(CLI)

    Spring Boot CLI是一个命令行工具,如果想使用Spring进行快速开发可以使用它。它允许你运行Groovy脚本,这意味着你可以使用熟悉的类Java语法,并且没有那么多的模板代码。你可以通过Spring Boot CLI启动新项目,或为它编写命令。

  • 服务监控(Actuator)

    SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等

第二节 SpringBoot快速入门

1. 代码实现

1.1 创建Maven工程

使用idea工具创建一个maven工程,该工程为普通的java工程即可

1.2 添加起步依赖

SpringBoot要求,项目要继承SpringBoot的起步依赖spring-boot-starter-parent

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">parent</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-parent<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">parent</span><span style="color:#117700">></span></span></span>

SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-web<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span></span></span>

1.3 编写SpringBoot引导类

要通过SpringBoot提供的引导类起步SpringBoot才可以进行访问

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@SpringBootApplication</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">PropertyApplication</span> {
​
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
        <span style="color:#000000">SpringApplication</span>.<span style="color:#000000">run</span>(<span style="color:#000000">PropertyApplication</span>.<span style="color:#770088">class</span>);
    }
​
}</span></span>

1.4 编写Controller

在引导类PropertyApplication同级包或者子级包中创建UserController

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RestController</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span> {
    
    <span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/welcome"</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">welcome</span>(){
        <span style="color:#770088">return</span> <span style="color:#aa1111">"welcome to springboot"</span>;
    }
}</span></span>

1.5 测试

执行SpringBoot起步类的主方法,服务器启动成功后打开浏览器地址栏访问

打开浏览器访问url地址为:http://localhost:8080

2. 快速入门解析

2.1 SpringBoot代码解析

  • @SpringBootApplication标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析)

  • SpringApplication.run(PropertyApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象

2.2 SpringBoot工程热部署

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能, 我们称之为热部署。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--热部署配置--></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-devtools<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

注意:IDEA进行SpringBoot热部署失败原因

出现这种情况,并不是热部署配置问题,其根本原因是因为Intellij IEDA默认情况下不会自动编译,需要对IDEA进行自动编译的设置,如下:然后 Shift+Ctrl+Alt+/,选择Registry

2.3 快速创建SpringBoot项目

演示idea快速创建的SpringBoot项目

第三节 SpringBoot的配置文件

1. 配置文件类型

SpringBoot的配置文件有三种类型:

  • properties

  • yml

  • yaml

SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件。

2. yml配置文件

2.1 yml配置文件简介

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据序列化格式,并且容易被人类阅读。YML文件是以数据为核心的,比传统的xml方式更加简洁。YML文件的扩展名可以使用.yml或者.yaml。

2.2 yml配置文件的语法

  • 配置普通数据

    • 语法:

      <span style="background-color:#f8f8f8"><span style="color:#221199"> key</span><span style="color:#555555">: </span>属性值 <span style="color:#aa5500">#注意:冒号后面有个空格</span></span>
    • 示例:

      <span style="background-color:#f8f8f8"><span style="color:#221199">port</span><span style="color:#555555">: </span><span style="color:#116644">9000 </span></span>
  • 配置对象数据/Map数据

    • 语法:

      <span style="background-color:#f8f8f8"><span style="color:#221199">key</span><span style="color:#555555">: </span>
      <span style="color:#221199">  属性名1</span><span style="color:#555555">: </span>属性值1
      <span style="color:#221199">  属性名2</span><span style="color:#555555">: </span>属性值2</span>
    • 示例代码:

      <span style="background-color:#f8f8f8"><span style="color:#221199">server</span><span style="color:#555555">:</span>
      <span style="color:#221199">  port</span><span style="color:#555555">: </span><span style="color:#116644">9000</span></span>

    注意:在yml语法中,相同缩进代表同一个级别

  • 配置数组(List、Set)数据

    • 语法:

      <span style="background-color:#f8f8f8"><span style="color:#221199">key</span><span style="color:#555555">:</span>
      <span style="color:#555555">  - </span>值1
      <span style="color:#555555">  - </span>值2
      ​
      <span style="color:#221199">key</span><span style="color:#555555">:</span>
        <span style="color:#555555">[</span>值1<span style="color:#555555">,</span> 值2<span style="color:#555555">]</span></span>
    • 示例代码:

      <span style="background-color:#f8f8f8"><span style="color:#221199">ages</span><span style="color:#555555">:</span>
      <span style="color:#555555">  - </span>20
      <span style="color:#555555">  - </span>22
      <span style="color:#555555">  - </span>24
        
      <span style="color:#221199">ages</span><span style="color:#555555">:</span>
        <span style="color:#555555">[</span>20<span style="color:#555555">,</span> 22<span style="color:#555555">,</span> 24<span style="color:#555555">]</span></span>

    注意:value1与value2之间的 - 之间存在一个空格

3 配置信息的查询

上面提及过,SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档

文档URL:Spring Boot Reference Guide

常用的配置摘抄如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># QUARTZ SCHEDULER (QuartzProperties)</span>
<span style="color:#0000ff">spring.quartz.jdbc.initialize-schema</span>=<span style="color:#009900">embedded # Database schema initialization mode.</span>
<span style="color:#0000ff">spring.quartz.jdbc.schema</span>=<span style="color:#009900">classpath</span>:<span style="color:#009900">org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.</span>
<span style="color:#0000ff">spring.quartz.job-store-type</span>=<span style="color:#009900">memory # Quartz job store type.</span>
<span style="color:#0000ff">spring.quartz.properties.*</span>=<span style="color:#009900"> # Additional Quartz Scheduler properties.</span>
​
<span style="color:#aa5500"># ----------------------------------------</span>
<span style="color:#aa5500"># WEB PROPERTIES</span>
<span style="color:#aa5500"># ----------------------------------------</span>
​
<span style="color:#aa5500"># EMBEDDED SERVER CONFIGURATION (ServerProperties)</span>
<span style="color:#0000ff">server.port</span>=<span style="color:#009900">8080 # Server HTTP port.</span>
<span style="color:#0000ff">server.servlet.context-path</span>=<span style="color:#009900"> # Context path of the application.</span>
<span style="color:#0000ff">server.servlet.path</span>=<span style="color:#009900">/ # Path of the main dispatcher servlet.</span>
​
<span style="color:#aa5500"># HTTP encoding (HttpEncodingProperties)</span>
<span style="color:#0000ff">spring.http.encoding.charset</span>=<span style="color:#009900">UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.</span>
​
<span style="color:#aa5500"># JACKSON (JacksonProperties)</span>
<span style="color:#0000ff">spring.jackson.date-format</span>=<span style="color:#009900"> # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH</span>:<span style="color:#009900">mm</span>:<span style="color:#009900">ss`.</span>
​
<span style="color:#aa5500"># SPRING MVC (WebMvcProperties)</span>
<span style="color:#0000ff">spring.mvc.servlet.load-on-startup</span>=<span style="color:#009900">-1 # Load on startup priority of the dispatcher servlet.</span>
<span style="color:#0000ff">spring.mvc.static-path-pattern</span>=<span style="color:#009900">/** # Path pattern used for static resources.</span>
<span style="color:#0000ff">spring.mvc.view.prefix</span>=<span style="color:#009900"> # Spring MVC view prefix.</span>
<span style="color:#0000ff">spring.mvc.view.suffix</span>=<span style="color:#009900"> # Spring MVC view suffix.</span>
​
<span style="color:#aa5500"># DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)</span>
<span style="color:#0000ff">spring.datasource.driver-class-name</span>=<span style="color:#009900"> # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.</span>
<span style="color:#0000ff">spring.datasource.password</span>=<span style="color:#009900"> # Login password of the database.</span>
<span style="color:#0000ff">spring.datasource.url</span>=<span style="color:#009900"> # JDBC URL of the database.</span>
<span style="color:#0000ff">spring.datasource.username</span>=<span style="color:#009900"> # Login username of the database.</span>
​
<span style="color:#aa5500"># JEST (Elasticsearch HTTP client) (JestProperties)</span>
<span style="color:#0000ff">spring.elasticsearch.jest.password</span>=<span style="color:#009900"> # Login password.</span>
<span style="color:#0000ff">spring.elasticsearch.jest.proxy.host</span>=<span style="color:#009900"> # Proxy host the HTTP client should use.</span>
<span style="color:#0000ff">spring.elasticsearch.jest.proxy.port</span>=<span style="color:#009900"> # Proxy port the HTTP client should use.</span>
<span style="color:#0000ff">spring.elasticsearch.jest.read-timeout</span>=<span style="color:#009900">3s # Read timeout.</span>
<span style="color:#0000ff">spring.elasticsearch.jest.username</span>=<span style="color:#009900"> # Login username.</span>
​</span></span>

我们可以通过配置application.poperties 或者 application.yml 来修改SpringBoot的默认配置

例如:

application.properties文件

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">server.port</span>=<span style="color:#009900">9000</span>
<span style="color:#0000ff">server.servlet.context-path</span>=<span style="color:#009900">property</span></span></span>

application.yml文件

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#221199">server</span><span style="color:#555555">:</span>
<span style="color:#221199">  port</span><span style="color:#555555">: </span><span style="color:#116644">9000</span>
<span style="color:#221199">  servlet</span><span style="color:#555555">:</span>
<span style="color:#221199">    context-path</span><span style="color:#555555">: </span>/property</span></span>

3 配置文件与配置类的属性映射方式

4.2.1 使用注解@Value映射

我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上

例如:

application.properties配置如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">person</span>:
<span style="color:#0000ff">  name</span>:<span style="color:#009900"> zhangsan</span>
<span style="color:#0000ff">  age</span>:<span style="color:#009900"> 18</span></span></span>

或者,application.yml配置如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#221199">person</span><span style="color:#555555">:</span>
<span style="color:#221199">  name</span><span style="color:#555555">: </span>zhangsan
<span style="color:#221199">  age</span><span style="color:#555555">: </span><span style="color:#116644">18</span></span></span>

实体Bean代码如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RestController</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span> {
​
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${person.name}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">name</span>;
    <span style="color:#555555">@Value</span>(<span style="color:#aa1111">"${person.age}"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">Integer</span> <span style="color:#000000">age</span>;
​
​
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/welcome"</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">welcome</span>(){
        <span style="color:#770088">return</span> <span style="color:#aa1111">"welcome to springboot, name="</span><span style="color:#981a1a">+</span><span style="color:#000000">name</span><span style="color:#981a1a">+</span><span style="color:#aa1111">",age="</span><span style="color:#981a1a">+</span><span style="color:#000000">age</span>;
    }
​
}</span></span>

4.2.2 使用注解@ConfigurationProperties映射

通过注解@ConfigurationProperties(prefix="配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射

application.properties配置如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">person</span>:
<span style="color:#0000ff">  name</span>:<span style="color:#009900"> zhangsan</span>
<span style="color:#0000ff">  age</span>:<span style="color:#009900"> 18</span></span></span>

或者,application.yml配置如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#221199">person</span><span style="color:#555555">:</span>
<span style="color:#221199">  name</span><span style="color:#555555">: </span>zhangsan
<span style="color:#221199">  age</span><span style="color:#555555">: </span><span style="color:#116644">18</span></span></span>

实体Bean代码如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RestController</span>
<span style="color:#555555">@ConfigurationProperties</span>(<span style="color:#000000">prefix</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"person"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span> {
​
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">name</span>;
    <span style="color:#770088">private</span> <span style="color:#008855">Integer</span> <span style="color:#000000">age</span>;
​
    <span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/welcome"</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">welcome</span>(){
        <span style="color:#770088">return</span> <span style="color:#aa1111">"welcome to springboot, name="</span><span style="color:#981a1a">+</span><span style="color:#000000">name</span><span style="color:#981a1a">+</span><span style="color:#aa1111">",age="</span><span style="color:#981a1a">+</span><span style="color:#000000">age</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setName</span>(<span style="color:#008855">String</span> <span style="color:#000000">name</span>) {
        <span style="color:#770088">this</span>.<span style="color:#000000">name</span> <span style="color:#981a1a">=</span> <span style="color:#000000">name</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setAge</span>(<span style="color:#008855">Integer</span> <span style="color:#000000">age</span>) {
        <span style="color:#770088">this</span>.<span style="color:#000000">age</span> <span style="color:#981a1a">=</span> <span style="color:#000000">age</span>;
    }
}</span></span>

注意:使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法

第四节 SpringBoot原理分析

1. 起步依赖原理分析

1.1 分析spring-boot-starter-parent

按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重点配置):

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">parent</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-dependencies<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">relativePath</span><span style="color:#117700">></span>../../spring-boot-dependencies<span style="color:#117700"></</span><span style="color:#117700">relativePath</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">parent</span><span style="color:#117700">></span></span></span>

按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的pom.xml,xml配置如下(只摘抄了部分重点配置):

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">properties</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">activemq.version</span><span style="color:#117700">></span>5.15.3<span style="color:#117700"></</span><span style="color:#117700">activemq.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">antlr2.version</span><span style="color:#117700">></span>2.7.7<span style="color:#117700"></</span><span style="color:#117700">antlr2.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">appengine-sdk.version</span><span style="color:#117700">></span>1.9.63<span style="color:#117700"></</span><span style="color:#117700">appengine-sdk.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artemis.version</span><span style="color:#117700">></span>2.4.0<span style="color:#117700"></</span><span style="color:#117700">artemis.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">aspectj.version</span><span style="color:#117700">></span>1.8.13<span style="color:#117700"></</span><span style="color:#117700">aspectj.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">assertj.version</span><span style="color:#117700">></span>3.9.1<span style="color:#117700"></</span><span style="color:#117700">assertj.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">atomikos.version</span><span style="color:#117700">></span>4.0.6<span style="color:#117700"></</span><span style="color:#117700">atomikos.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">bitronix.version</span><span style="color:#117700">></span>2.1.4<span style="color:#117700"></</span><span style="color:#117700">bitronix.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">build-helper-maven-plugin.version</span><span style="color:#117700">></span>3.0.0<span style="color:#117700"></</span><span style="color:#117700">build-helper-maven-plugin.version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">byte-buddy.version</span><span style="color:#117700">></span>1.7.11<span style="color:#117700"></</span><span style="color:#117700">byte-buddy.version</span><span style="color:#117700">></span>
    ... ... ...
<span style="color:#117700"></</span><span style="color:#117700">properties</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependencyManagement</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-test<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        ... ... ...
    <span style="color:#117700"></</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependencyManagement</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">build</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">pluginManagement</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">plugins</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.jetbrains.kotlin<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>kotlin-maven-plugin<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>${kotlin.version}<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"></</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.jooq<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>jooq-codegen-maven<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>${jooq.version}<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"></</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-maven-plugin<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"></</span><span style="color:#117700">plugin</span><span style="color:#117700">></span>
            ... ... ...
        <span style="color:#117700"></</span><span style="color:#117700">plugins</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">pluginManagement</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">build</span><span style="color:#117700">></span></span></span>

从上面的spring-boot-starter-dependencies的pom.xml中我们可以发现,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定 等配置了。所以起步依赖的作用就是进行依赖的传递。

1.2 分析spring-boot-starter-web

按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如下(只摘抄了部分重点配置):

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">project</span> <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://maven.apache.org/POM/4.0.0"</span>
    <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">modelVersion</span><span style="color:#117700">></span>4.0.0<span style="color:#117700"></</span><span style="color:#117700">modelVersion</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">parent</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starters<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">parent</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-web<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">name</span><span style="color:#117700">></span>Spring Boot Web Starter<span style="color:#117700"></</span><span style="color:#117700">name</span><span style="color:#117700">></span>
  
    <span style="color:#117700"><</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>compile<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-json<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>compile<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-tomcat<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.0.1.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>compile<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.hibernate.validator<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>hibernate-validator<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>6.0.9.Final<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>compile<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-web<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.5.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>compile<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-webmvc<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.0.5.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>compile<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">project</span><span style="color:#117700">></span>
​</span></span>

从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。

2. 自动配置原理解析

按住Ctrl点击查看启动类PropertyApplication上的注解@SpringBootApplication

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@SpringBootApplication</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">PropertyApplication</span> {
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {
        <span style="color:#000000">SpringApplication</span>.<span style="color:#000000">run</span>(<span style="color:#000000">PropertyApplication</span>.<span style="color:#770088">class</span>);
    }
}</span></span>

注解@SpringBootApplication的源码

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Target</span>(<span style="color:#000000">ElementType</span>.<span style="color:#000000">TYPE</span>)
<span style="color:#555555">@Retention</span>(<span style="color:#000000">RetentionPolicy</span>.<span style="color:#000000">RUNTIME</span>)
<span style="color:#555555">@Documented</span>
<span style="color:#555555">@Inherited</span>
<span style="color:#555555">@SpringBootConfiguration</span>
<span style="color:#555555">@EnableAutoConfiguration</span>
<span style="color:#555555">@ComponentScan</span>(<span style="color:#000000">excludeFilters</span> <span style="color:#981a1a">=</span> {
        <span style="color:#555555">@Filter</span>(<span style="color:#000000">type</span> <span style="color:#981a1a">=</span> <span style="color:#000000">FilterType</span>.<span style="color:#000000">CUSTOM</span>, <span style="color:#000000">classes</span> <span style="color:#981a1a">=</span> <span style="color:#000000">TypeExcludeFilter</span>.<span style="color:#770088">class</span>),
        <span style="color:#555555">@Filter</span>(<span style="color:#000000">type</span> <span style="color:#981a1a">=</span> <span style="color:#000000">FilterType</span>.<span style="color:#000000">CUSTOM</span>, <span style="color:#000000">classes</span> <span style="color:#981a1a">=</span> <span style="color:#000000">AutoConfigurationExcludeFilter</span>.<span style="color:#770088">class</span>) })
<span style="color:#770088">public</span> <span style="color:#770088">@interface</span> <span style="color:#0000ff">SpringBootApplication</span> {
​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Exclude specific auto-configuration classes such that they will never be applied.</span>
     <span style="color:#aa5500">* @return the classes to exclude</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#555555">@AliasFor</span>(<span style="color:#000000">annotation</span> <span style="color:#981a1a">=</span> <span style="color:#000000">EnableAutoConfiguration</span>.<span style="color:#770088">class</span>)
    <span style="color:#000000">Class</span><span style="color:#981a1a"><?></span>[] <span style="color:#000000">exclude</span>() <span style="color:#770088">default</span> {};
​
    ... ... ...
​
}</span></span>

其中,@SpringBootConfiguration:等同与@Configuration,即标注该类是Spring的一个配置类

@EnableAutoConfiguration表示SpringBoot自动配置功能开启

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Target</span>(<span style="color:#000000">ElementType</span>.<span style="color:#000000">TYPE</span>)
<span style="color:#555555">@Retention</span>(<span style="color:#000000">RetentionPolicy</span>.<span style="color:#000000">RUNTIME</span>)
<span style="color:#555555">@Documented</span>
<span style="color:#555555">@Inherited</span>
<span style="color:#555555">@AutoConfigurationPackage</span>
<span style="color:#555555">@Import</span>(<span style="color:#000000">AutoConfigurationImportSelector</span>.<span style="color:#770088">class</span>)
<span style="color:#770088">public</span> <span style="color:#770088">@interface</span> <span style="color:#0000ff">EnableAutoConfiguration</span> {
    ... ... ...
}</span></span>

其中,@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类

按住Ctrl点击查看AutoConfigurationImportSelector源码

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#008855">String</span>[] <span style="color:#0000ff">selectImports</span>(<span style="color:#000000">AnnotationMetadata</span> <span style="color:#000000">annotationMetadata</span>) {
        ... ... ...
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">configurations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">getCandidateConfigurations</span>(<span style="color:#000000">annotationMetadata</span>, <span style="color:#000000">attributes</span>);
        <span style="color:#000000">configurations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">removeDuplicates</span>(<span style="color:#000000">configurations</span>);
        <span style="color:#000000">Set</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">exclusions</span> <span style="color:#981a1a">=</span> <span style="color:#000000">getExclusions</span>(<span style="color:#000000">annotationMetadata</span>, <span style="color:#000000">attributes</span>);
        <span style="color:#000000">checkExcludedClasses</span>(<span style="color:#000000">configurations</span>, <span style="color:#000000">exclusions</span>);
        <span style="color:#000000">configurations</span>.<span style="color:#000000">removeAll</span>(<span style="color:#000000">exclusions</span>);
        <span style="color:#000000">configurations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">filter</span>(<span style="color:#000000">configurations</span>, <span style="color:#000000">autoConfigurationMetadata</span>);
        <span style="color:#000000">fireAutoConfigurationImportEvents</span>(<span style="color:#000000">configurations</span>, <span style="color:#000000">exclusions</span>);
        <span style="color:#770088">return</span> <span style="color:#000000">StringUtils</span>.<span style="color:#000000">toStringArray</span>(<span style="color:#000000">configurations</span>);
}
​
​
<span style="color:#770088">protected</span> <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getCandidateConfigurations</span>(<span style="color:#000000">AnnotationMetadata</span> <span style="color:#000000">metadata</span>,
            <span style="color:#000000">AnnotationAttributes</span> <span style="color:#000000">attributes</span>) {
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">configurations</span> <span style="color:#981a1a">=</span> <span style="color:#000000">SpringFactoriesLoader</span>.<span style="color:#000000">loadFactoryNames</span>(
                <span style="color:#000000">getSpringFactoriesLoaderFactoryClass</span>(), <span style="color:#000000">getBeanClassLoader</span>());
        
        <span style="color:#770088">return</span> <span style="color:#000000">configurations</span>;
}
​</span></span>

其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表

spring.factories 文件中有关自动配置的配置信息如下:

<span style="background-color:#f8f8f8"><span style="color:#333333">... ... ...
​
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
​
... ... ...</span></span>

上面配置文件存在大量的以Configuration为结尾的类名称,这些类就是存有自动配置信息的类,而SpringApplication在获取这些类名后再加载

我们以ServletWebServerFactoryAutoConfiguration为例来分析源码:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Configuration</span>
<span style="color:#555555">@AutoConfigureOrder</span>(<span style="color:#000000">Ordered</span>.<span style="color:#000000">HIGHEST_PRECEDENCE</span>)
<span style="color:#555555">@ConditionalOnClass</span>(<span style="color:#000000">ServletRequest</span>.<span style="color:#770088">class</span>)
<span style="color:#555555">@ConditionalOnWebApplication</span>(<span style="color:#000000">type</span> <span style="color:#981a1a">=</span> <span style="color:#000000">Type</span>.<span style="color:#000000">SERVLET</span>)
<span style="color:#555555">@EnableConfigurationProperties</span>(<span style="color:#000000">ServerProperties</span>.<span style="color:#770088">class</span>)
<span style="color:#555555">@Import</span>({ <span style="color:#000000">ServletWebServerFactoryAutoConfiguration</span>.<span style="color:#000000">BeanPostProcessorsRegistrar</span>.<span style="color:#770088">class</span>,
        <span style="color:#000000">ServletWebServerFactoryConfiguration</span>.<span style="color:#000000">EmbeddedTomcat</span>.<span style="color:#770088">class</span>,
        <span style="color:#000000">ServletWebServerFactoryConfiguration</span>.<span style="color:#000000">EmbeddedJetty</span>.<span style="color:#770088">class</span>,
        <span style="color:#000000">ServletWebServerFactoryConfiguration</span>.<span style="color:#000000">EmbeddedUndertow</span>.<span style="color:#770088">class</span> })
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ServletWebServerFactoryAutoConfiguration</span> {
    ... ... ...
}
​</span></span>

其中,@EnableConfigurationProperties(ServerProperties.class) 代表加载ServerProperties服务器配置属性类进入ServerProperties.class源码如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@ConfigurationProperties</span>(<span style="color:#000000">prefix</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"server"</span>, <span style="color:#000000">ignoreUnknownFields</span> <span style="color:#981a1a">=</span> <span style="color:#221199">true</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ServerProperties</span> {
​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Server HTTP port.</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">private</span> <span style="color:#008855">Integer</span> <span style="color:#000000">port</span>;
​
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* Network address to which the server should bind.</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#770088">private</span> <span style="color:#000000">InetAddress</span> <span style="color:#000000">address</span>;
  
    ... ... ...
  
}</span></span>

其中,prefix = "server" 表示SpringBoot配置文件中的前缀,SpringBoot会将配置文件中以server开始的属性映射到该类的字段中。

第五节 SpringBoot与整合其他技术

1. SpringBoot 整合 Mybatis

1.1 添加依赖

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--mybatis起步依赖--></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.mybatis.spring.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mybatis-spring-boot-starter<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.1.1<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!-- MySQL连接驱动 --></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>mysql<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mysql-connector-java<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

1.2 添加数据库连接信息

在application.properties中添加数据量的连接信息

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#DB Configuration:</span>
<span style="color:#0000ff">spring.datasource.driverClassName</span>=<span style="color:#009900">com.mysql.cj.jdbc.Driver</span>
<span style="color:#0000ff">spring.datasource.url</span>=<span style="color:#009900">jdbc</span>:<span style="color:#009900">mysql</span>:<span style="color:#009900">//127.0.0.1</span>:<span style="color:#009900">3306/property?useUnicode</span>=<span style="color:#009900">true&characterEncoding</span>=<span style="color:#009900">utf8&serverTimezone</span>=<span style="color:#009900">Asia/Shanghai</span>
<span style="color:#0000ff">spring.datasource.username</span>=<span style="color:#009900">root</span>
<span style="color:#0000ff">spring.datasource.password</span>=<span style="color:#009900">root</span></span></span>

1.3 创建user表

在test数据库中创建user表

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">-- ----------------------------</span>
<span style="color:#aa5500">-- Table structure for `user`</span>
<span style="color:#aa5500">-- ----------------------------</span>
<span style="color:#770088">DROP</span> <span style="color:#770088">TABLE</span> <span style="color:#770088">IF</span> <span style="color:#770088">EXISTS</span> <span style="color:#0055aa">`user`</span>;
<span style="color:#770088">CREATE</span> <span style="color:#770088">TABLE</span> <span style="color:#0055aa">`user`</span> <span style="color:#999977">(</span>
  <span style="color:#0055aa">`id`</span> int<span style="color:#999977">(</span><span style="color:#116644">11</span><span style="color:#999977">)</span> <span style="color:#770088">NOT</span> <span style="color:#221199">NULL</span> <span style="color:#770088">AUTO_INCREMENT</span>,
  <span style="color:#0055aa">`username`</span> varchar<span style="color:#999977">(</span><span style="color:#116644">50</span><span style="color:#999977">)</span> <span style="color:#770088">DEFAULT</span> <span style="color:#221199">NULL</span>,
  <span style="color:#0055aa">`password`</span> varchar<span style="color:#999977">(</span><span style="color:#116644">50</span><span style="color:#999977">)</span> <span style="color:#770088">DEFAULT</span> <span style="color:#221199">NULL</span>,
  <span style="color:#0055aa">`name`</span> varchar<span style="color:#999977">(</span><span style="color:#116644">50</span><span style="color:#999977">)</span> <span style="color:#770088">DEFAULT</span> <span style="color:#221199">NULL</span>,
  <span style="color:#770088">PRIMARY</span> <span style="color:#770088">KEY</span> <span style="color:#999977">(</span><span style="color:#0055aa">`id`</span><span style="color:#999977">)</span>
<span style="color:#999977">)</span> <span style="color:#770088">ENGINE</span><span style="color:#981a1a">=</span><span style="color:#770088">InnoDB</span> <span style="color:#770088">AUTO_INCREMENT</span><span style="color:#981a1a">=</span><span style="color:#116644">10</span> <span style="color:#770088">DEFAULT</span> <span style="color:#3300aa">CHARSET</span><span style="color:#981a1a">=</span>utf8;
​
<span style="color:#aa5500">-- ----------------------------</span>
<span style="color:#aa5500">-- Records of user</span>
<span style="color:#aa5500">-- ----------------------------</span>
<span style="color:#770088">INSERT</span> <span style="color:#770088">INTO</span> <span style="color:#0055aa">`user`</span> <span style="color:#770088">VALUES</span> <span style="color:#999977">(</span><span style="color:#aa1111">'1'</span>, <span style="color:#aa1111">'zhangsan'</span>, <span style="color:#aa1111">'123'</span>, <span style="color:#aa1111">'张三'</span><span style="color:#999977">)</span>;
<span style="color:#770088">INSERT</span> <span style="color:#770088">INTO</span> <span style="color:#0055aa">`user`</span> <span style="color:#770088">VALUES</span> <span style="color:#999977">(</span><span style="color:#aa1111">'2'</span>, <span style="color:#aa1111">'lisi'</span>, <span style="color:#aa1111">'123'</span>, <span style="color:#aa1111">'李四'</span><span style="color:#999977">)</span>;</span></span>

1.4 创建实体Bean

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">User</span> {
    <span style="color:#aa5500">// 主键</span>
    <span style="color:#770088">private</span> <span style="color:#008855">Long</span> <span style="color:#000000">id</span>;
    <span style="color:#aa5500">// 用户名</span>
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">username</span>;
    <span style="color:#aa5500">// 密码</span>
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">password</span>;
    <span style="color:#aa5500">// 姓名</span>
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">name</span>;
  
    <span style="color:#aa5500">//此处省略getter和setter方法 .. ..</span>
    
}</span></span>

1.5 编写Mapper

<span style="background-color:#f8f8f8"><span style="color:#333333">@Mapper
public interface UserMapper {
	public List<User> queryUserList();
}</span></span>

注意:@Mapper标记该类是一个mybatis的mapper接口,可以被spring boot自动扫描到spring上下文中

1.6 配置Mapper映射文件

在src\main\resources\mapper路径下加入UserMapper.xml配置文件"

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="utf-8" ?></span>
<span style="color:#555555"><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ></span>
<span style="color:#117700"><</span><span style="color:#117700">mapper</span> <span style="color:#0000cc">namespace</span>=<span style="color:#aa1111">"com.qf.spring.boot.mapper.UserMapper"</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"queryUserList"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"user"</span><span style="color:#117700">></span>
        select * from user
    <span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">mapper</span><span style="color:#117700">></span></span></span>

1.7 配置mybatis

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#spring集成Mybatis环境</span>
<span style="color:#aa5500">#pojo别名扫描包</span>
<span style="color:#0000ff">mybatis.type-aliases-package</span>=<span style="color:#009900">com.qf.spring.boot.model</span>
<span style="color:#aa5500">#加载Mybatis映射文件</span>
<span style="color:#0000ff">mybatis.mapper-locations</span>=<span style="color:#009900">classpath</span>:<span style="color:#009900">mapper/*Mapper.xml</span></span></span>

1.8 编写测试Controller

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RestController</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span> {
​
    <span style="color:#555555">@Autowired</span>
    <span style="color:#770088">private</span> <span style="color:#000000">UserMapper</span> <span style="color:#000000">userMapper</span>;
​
    <span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/queryUser"</span>)
    <span style="color:#770088">public</span> <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">queryUser</span>(){
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">users</span> <span style="color:#981a1a">=</span> <span style="color:#000000">userMapper</span>.<span style="color:#000000">queryUserList</span>();
        <span style="color:#770088">return</span> <span style="color:#000000">users</span>;
    }
​
}</span></span>

2. SpringBoot 整合 Junit

2.1 添加依赖

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--测试的起步依赖--></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-test<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>test<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

2.2 编写测试类

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RunWith</span>(<span style="color:#000000">SpringRunner</span>.<span style="color:#770088">class</span>)
<span style="color:#555555">@SpringBootTest</span>(<span style="color:#000000">classes</span> <span style="color:#981a1a">=</span> <span style="color:#000000">PropertyApplication</span>.<span style="color:#770088">class</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">MapperTest</span> {
​
    <span style="color:#555555">@Autowired</span>
    <span style="color:#770088">private</span> <span style="color:#000000">UserMapper</span> <span style="color:#000000">userMapper</span>;
​
    <span style="color:#555555">@Test</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">test</span>() {
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">users</span> <span style="color:#981a1a">=</span> <span style="color:#000000">userMapper</span>.<span style="color:#000000">queryUserList</span>();
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">users</span>);
    }
​
}</span></span>

其中,SpringRunner继承自SpringJUnit4ClassRunner,使用哪一个Spring提供的测试测试引擎都可以

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">final</span> <span style="color:#770088">class</span> <span style="color:#0000ff">SpringRunner</span> <span style="color:#770088">extends</span> <span style="color:#000000">SpringJUnit4ClassRunner</span> </span></span>

@SpringBootTest的属性指定的是引导类的字节码对象

3. SpringBoot 整合 JPA

3.1 添加依赖

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!-- springBoot JPA的起步依赖 --></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter-data-jpa<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!-- MySQL连接驱动 --></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>mysql<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mysql-connector-java<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

3.2 配置 jpa

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#DB Configuration:</span>
<span style="color:#0000ff">spring.datasource.driverClassName</span>=<span style="color:#009900">com.mysql.cj.jdbc.Driver</span>
<span style="color:#0000ff">spring.datasource.url</span>=<span style="color:#009900">jdbc</span>:<span style="color:#009900">mysql</span>:<span style="color:#009900">//127.0.0.1</span>:<span style="color:#009900">3306/property?useUnicode</span>=<span style="color:#009900">true&characterEncoding</span>=<span style="color:#009900">utf8&serverTimezone</span>=<span style="color:#009900">Asia/Shanghai</span>
<span style="color:#0000ff">spring.datasource.username</span>=<span style="color:#009900">root</span>
<span style="color:#0000ff">spring.datasource.password</span>=<span style="color:#009900">root</span>
​
<span style="color:#aa5500">#JPA Configuration:</span>
<span style="color:#0000ff">spring.jpa.database</span>=<span style="color:#009900">MySQL</span>
<span style="color:#0000ff">spring.jpa.show-sql</span>=<span style="color:#009900">true</span>
<span style="color:#0000ff">spring.jpa.generate-ddl</span>=<span style="color:#009900">true</span>
<span style="color:#0000ff">spring.jpa.hibernate.ddl-auto</span>=<span style="color:#009900">update</span>
<span style="color:#0000ff">spring.jpa.hibernate.naming_strategy</span>=<span style="color:#009900">org.hibernate.cfg.ImprovedNamingStrategy</span></span></span>

3.3 创建实体配置实体

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Entity</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">User</span> {
    <span style="color:#aa5500">// 主键</span>
    <span style="color:#555555">@Id</span>
    <span style="color:#555555">@GeneratedValue</span>(<span style="color:#000000">strategy</span> <span style="color:#981a1a">=</span> <span style="color:#000000">GenerationType</span>.<span style="color:#000000">IDENTITY</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">Long</span> <span style="color:#000000">id</span>;
    <span style="color:#aa5500">// 用户名</span>
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">username</span>;
    <span style="color:#aa5500">// 密码</span>
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">password</span>;
    <span style="color:#aa5500">// 姓名</span>
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">name</span>;
 
    <span style="color:#aa5500">//此处省略setter和getter方法... ...</span>
}</span></span>

3.4 编写UserRepository

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">UserRepository</span> <span style="color:#770088">extends</span> <span style="color:#000000">JpaRepository</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span>,<span style="color:#008855">Long</span><span style="color:#981a1a">></span>{
    <span style="color:#770088">public</span> <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">findAll</span>();
}</span></span>

3.5 编写测试类

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RunWith</span>(<span style="color:#000000">SpringRunner</span>.<span style="color:#770088">class</span>)
<span style="color:#555555">@SpringBootTest</span>(<span style="color:#000000">classes</span><span style="color:#981a1a">=</span><span style="color:#000000">MySpringBootApplication</span>.<span style="color:#770088">class</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">JpaTest</span> {
​
    <span style="color:#555555">@Autowired</span>
    <span style="color:#770088">private</span> <span style="color:#000000">UserRepository</span> <span style="color:#000000">userRepository</span>;
​
    <span style="color:#555555">@Test</span>
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">test</span>(){
        <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">users</span> <span style="color:#981a1a">=</span> <span style="color:#000000">userRepository</span>.<span style="color:#000000">findAll</span>();
        <span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">users</span>);
    }
​
}</span></span>

3.6 控制台打印信息

解决方案:手动导入对应的maven坐标,如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--jdk9需要导入如下坐标--></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>javax.xml.bind<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>jaxb-api<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.3.0<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

第六节 制作 rsa-starter

1. 新建 maven 工程

 

 

2. 引入依赖包

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
​
<span style="color:#117700"><</span><span style="color:#117700">project</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://maven.apache.org/POM/4.0.0"</span> <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span>
  <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">modelVersion</span><span style="color:#117700">></span>4.0.0<span style="color:#117700"></</span><span style="color:#117700">modelVersion</span><span style="color:#117700">></span>
​
  <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>com.qf<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>rsa-starter<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.0<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
​
  <span style="color:#117700"><</span><span style="color:#117700">name</span><span style="color:#117700">></span>rsa-starter<span style="color:#117700"></</span><span style="color:#117700">name</span><span style="color:#117700">></span>
​
  <span style="color:#117700"><</span><span style="color:#117700">properties</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">project.build.sourceEncoding</span><span style="color:#117700">></span>UTF-8<span style="color:#117700"></</span><span style="color:#117700">project.build.sourceEncoding</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">maven.compiler.source</span><span style="color:#117700">></span>1.8<span style="color:#117700"></</span><span style="color:#117700">maven.compiler.source</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">maven.compiler.target</span><span style="color:#117700">></span>1.8<span style="color:#117700"></</span><span style="color:#117700">maven.compiler.target</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">properties</span><span style="color:#117700">></span>
​
  <span style="color:#117700"><</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-starter<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.5.6<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--自动装配的包--></span>
    <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-autoconfigure<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.5.6<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--支持元数据配置的包--></span>
    <span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework.boot<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-boot-configuration-processor<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>2.5.6<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">dependencies</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">project</span><span style="color:#117700">></span></span></span>

3. 编写配置属性

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">qf</span>.<span style="color:#000000">rsa</span>.<span style="color:#000000">spring</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">config</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">context</span>.<span style="color:#000000">properties</span>.<span style="color:#000000">ConfigurationProperties</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* @Author: wu</span>
 <span style="color:#aa5500">* @Description:</span>
 <span style="color:#aa5500">* @Date: 2021-11-02</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@ConfigurationProperties</span>(<span style="color:#000000">prefix</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"rsa"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">RsaProperties</span> {
​
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">secret</span>;
​
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getSecret</span>() {
        <span style="color:#770088">return</span> <span style="color:#000000">secret</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setSecret</span>(<span style="color:#008855">String</span> <span style="color:#000000">secret</span>) {
        <span style="color:#770088">this</span>.<span style="color:#000000">secret</span> <span style="color:#981a1a">=</span> <span style="color:#000000">secret</span>;
    }
}</span></span>

4. 编写自动配置类

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">qf</span>.<span style="color:#000000">rsa</span>.<span style="color:#000000">spring</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">config</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">qf</span>.<span style="color:#000000">rsa</span>.<span style="color:#000000">spring</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">RsaUtil</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">autoconfigure</span>.<span style="color:#000000">condition</span>.<span style="color:#000000">ConditionalOnClass</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">autoconfigure</span>.<span style="color:#000000">condition</span>.<span style="color:#000000">ConditionalOnMissingBean</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">boot</span>.<span style="color:#000000">context</span>.<span style="color:#000000">properties</span>.<span style="color:#000000">EnableConfigurationProperties</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Bean</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Configuration</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">security</span>.<span style="color:#000000">NoSuchAlgorithmException</span>;
​
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* @Author: wu</span>
 <span style="color:#aa5500">* @Description:</span>
 <span style="color:#aa5500">* @Date: 2021-11-02</span>
 <span style="color:#aa5500">*/</span>
​
<span style="color:#555555">@Configuration</span>
<span style="color:#aa5500">//@ConditionalOnBean  Bean已经存在应用上下文时才会加载</span>
<span style="color:#aa5500">//@ConditionalOnMissingBean</span>
<span style="color:#555555">@ConditionalOnClass</span>(<span style="color:#000000">RsaUtil</span>.<span style="color:#770088">class</span>) <span style="color:#aa5500">//在类路径下存在RsaUtil类时才会启用该配置</span>
<span style="color:#aa5500">//@ConditionalOnMissingClass</span>
<span style="color:#aa5500">//@ConditionalOnResource 如果我们要加载的 bean 依赖指定资源是否存在于 classpath 中,那么我们就可以使用这个注解</span>
<span style="color:#555555">@EnableConfigurationProperties</span>(<span style="color:#000000">RsaProperties</span>.<span style="color:#770088">class</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">RsaAutoConfiguration</span> {
​
    <span style="color:#555555">@Bean</span>
    <span style="color:#555555">@ConditionalOnMissingBean</span>
    <span style="color:#770088">public</span> <span style="color:#000000">RsaUtil</span> <span style="color:#000000">rsaUtil</span>(<span style="color:#000000">RsaProperties</span> <span style="color:#000000">rsaProperties</span>) <span style="color:#770088">throws</span> <span style="color:#000000">NoSuchAlgorithmException</span> {
        <span style="color:#000000">RsaUtil</span> <span style="color:#000000">rsaUtil</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">RsaUtil</span>();
        <span style="color:#000000">rsaUtil</span>.<span style="color:#000000">setRsaProperties</span>(<span style="color:#000000">rsaProperties</span>);
        <span style="color:#000000">rsaUtil</span>.<span style="color:#000000">init</span>();
        <span style="color:#770088">return</span> <span style="color:#000000">rsaUtil</span>;
    }
}</span></span>

5. 创建自动装配文件

在resource目录下创建 META-INF目录,然后在META-INF目录下创建 spring.factories 文件,并添加如下内容

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># Auto Configure</span>
<span style="color:#0000ff">org.springframework.boot.autoconfigure.EnableAutoConfiguration</span>=<span style="color:#009900">\</span>
<span style="color:#009900">com.qf.rsa.spring.boot.config.RsaAutoConfiguration</span></span></span>

6. 编译 打包

7. 在其他工程中引入测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值