SpringBoot框架

1、SpringBoot框架

SpringBoot简化了Spring应用的搭建和开发过程,去除了大量的XML配置文件,简化了复杂的依赖管理。

Spring Boot 提供了大量开箱即用(out-of-the-box)的依赖模块,例如 spring-boot-starter-redis、spring-boot-starter-data-mongodb 和 spring-boot-starter-data-elasticsearch 等。这些依赖模块为 Spring Boot 应用提供了大量的自动配置,使得 Spring Boot 应用只需要非常少量的配置甚至零配置,便可以运行起来,让开发人员从 Spring 的“配置地狱”中解放出来,有更多的精力专注于业务逻辑的开发。

Spring Boot的特点

(1)独立运行的Spring项目:可以以 jar 包的形式独立运行;

(2)内嵌Servlet容器:使用嵌入式的Servlet容器(如Tomcat、Jetty、Undertow),应用无需达成WAR包;

(3)提供starter简化Maven配置:提供了一系列的”starter“项目对象模型(POMS)简化配置;

(4)提供了大量的自动配置:简化项目的开发;

(5)自带应用监控:可以对正在运行的项目提供监控:

(6)无代码生成和xml配置:不需要任何xml配置即可实现Spring的所有配置;

2、创建Spring Boot项目

(1)使用Maven创建;

(2)使用Spring Initializr创建;

3、Spring Boot starter

Spring Boot 将日常企业应用研发中的各种场景都抽取出来,做成一个个的 starter(启动器),starter 中整合了该场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。starter 提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰。所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则。

Spring Boot 项目可以通过继承 spring-boot-starter-parent 来获得一些合理的默认配置,它主要提供了以下特性:

  • 默认 JDK 版本(Java 8)

  • 默认字符集(UTF-8)

  • 依赖管理功能

  • 资源过滤

  • 默认插件配置

  • 识别 application.properties 和 application.yml 类型的配置文件

4、YAML教程

(1)YAML 全称 YAML Ain't Markup Language,它是一种以数据为中心的标记语言,比 XML 和 JSON 更适合作为配置文件。

想要使用 YAML 作为属性配置文件(以 .yml 或 .yaml 结尾),需要将 SnakeYAML 库添加到 classpath 下,Spring Boot 中的 spring-boot-starter-web 或 spring-boot-starter 都对 SnakeYAML 库做了集成, 只要项目中引用了这两个 Starter 中的任何一个,Spring Boot 会自动添加 SnakeYAML 库到 classpath 下。

(2)SpringBoot 默认使用以下 2 种全局的配置文件,其文件名是固定的。

  • application.properties

  • application.yml

(3)YAML 的语法如下:

  • 使用缩进表示层级关系。

  • 缩进时不允许使用 Tab 键,只允许使用空格。

  • 缩进的空格数不重要,但同级元素必须左侧对齐。

  • 大小写敏感。

(4)YAML 支持以下三种数据结构:

  • 对象:键值对的集合

  • 数组:一组按次序排列的值

  • 字面量:单个的、不可拆分的值

(5)字面量是指单个的,不可拆分的值,例如:数字、字符串、布尔值、以及日期等。

(6)YAML对象写法

普通写法:

website:

name: bianchengbang

url: www.biancheng.net

行内写法:website: {name: bianchengbang,url: www.biancheng.net}

(7)YAML数组写法

YAML 使用“-”表示数组中的元素,普通写法如下:

pets:

-dog

-cat

-pig

行内写法:pets: [dog,cat,pig]

(8)YAML组织结构:一个 YAML 文件可以由一个或多个文档组成,文档之间使用“---作为分隔符,且个文档相互独立,互不干扰。如果 YAML 文件只包含一个文档,则“---分隔符可以省略。

5、Spring Boot配置绑定

配置绑定,就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。

Spring Boot提供的2种方式进行配置绑定:

(1)使用@ConfigurationProperties注解(在容器中的组件,@Component添加到容器中)在类上

①、在全局配置文件application.yml中添加自定义属性;

②、创建实体类,并将配置文件中的属性映射到实体类上;

(2)使用@Value注解,在属性上

@Value和@ConfigurationProperties区别:

(1)使用位置不同:

①、@ConfigurationProperties:标注在JavaBean的类名上;

②、@Value:标注在JavaBean的属性上;

(2)功能不同:

①、@ConfigurationProperties:用于批量绑定配置文件中的配置;

②、@Value:只能一个一个的指定需要绑定的配置;

(3)松散绑定支持不同:

①、@ConfigurationProperties:支持松散绑定(松散语法);

②、@Value:不支持松散绑定;

(4)SpEL支持不同:

①、@ConfigurationProperties:不支持SpEL表达式;

②、@Value:支持SpEL表达式;

(5)复杂类型封装:

①、@ConfigurationProperties:支持所有类型数据的封装,例如Map、List、Set、以及对象等;

②、@Value:只支持基本数据类型的封装,例如字符串、布尔值、整数等类型;

(6)应用场景不同:

①、@ConfigurationProperties:专门编写JavaBean来和配置文件进行映射;

②、@Value:获取配置文件中的某项值;

@PropertySource注解指向该配置文件

6、Spring Boot导入Spring配置

两种导入方式:

(1)使用@ImportResource注解加载Spring配置文件;

①、创建接口;

②、实现接口;

③、添加Bean到配置文件;

④、校验 IOC 容器是否已经包含创建的接口;

⑤、在主启动程序类上面使用@ImportResource注解,将Spring配置文件beans.xml加载到项目中

(2)使用全注解方式加载Spring配置;

①、使用@Configuration注解定义配置类,替换Spring的配置文件;

②、配置类内部可以包含有一个或多个被 @Bean 注解的方法,这些方法会被 AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 类扫描,构建 bean 定义(相当于 Spring 配置文件中的<bean></bean>标签),方法的返回值会以组件的形式添加到容器中,组件的 id 就是方法名。

7、Spring Boot Profile(多环境配置)

(1)多Profile文件方式

配置文件的两种形式:.properties文件和.yml文件,区分出不同的环境配置,文件命名格式:application-{profile}.properties/yml

其中,{profile} 一般为各个环境的名称或简称,例如 dev、test 和 prod 等等。

properties配置:在resources下添加4个配置文件

①、application.properties:主配置文件

②、application-dev.properties:开发环境配置文件

③、application-test.properties:测试环境配置文件

④、application-prod.properties:生产环境配置文件

(2)多Profile文档块模式

在 YAML 配置文件中,可以使用“---”把配置文件分割成了多个文档块,因此我们可以在不同的文档块中针对不同的环境进行不同的配置,并在第一个文档块内对配置进行切换。

(3)激活Profile(配置文件、命令行激活、虚拟机参数激活)

命令行激活:java -jar helloworld-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

虚拟机参数激活:java -Dspring.profiles.active=prod -jar helloworld-0.0.1-SNAPSHOT.jar

8、Spring Boot默认配置文件

默认配置文件:resources目录下的application.properties或application.yml;

Spring Boot启动时扫描的5个位置:file:./config/、file:./config/*/、file:./、classpath:/config/、classpath:/

(注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。)

所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:

  • 存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;

  • 存在不同的配置内容时,高优先级和低优先级的配置内容取并集。

9、Spring Boot外部配置文件

通过2个参数,指定外部配置文件的路径:

spring.config.location:指定外部配置文件的路径,这样会使默认配置文件失效;

java -jar {JAR} --spring.config.location={外部配置文件全路径}

spring.config.additional-location:指定外部部署文件的路径,不会使默认配置文件失效;

java -jar {JAR} --spring.config.additional-location={外部配置文件全路径}

10、Spring Boot配置加载顺序

Spring Boot配置形式及其加载顺序(优先级由高到低):

(1)命令行参数:java -jar {Jar文件名} --{参数1}={参数值1} --{参数2}={参数值2};

(2)来自java:comp/env的JNDI属性;

(3)Java系统属性(System.getProperties());

(4)操作系统环境变量;

(5)RandomValuePropertySource配置的random.*属性值;

(6)配置文件(YAML文件、Properties文件);

(7)@Configuration注解类上的@PropertySource指定的配置文件;

(8)通过SpringApplication.setDefaultProperties指定的默认属性;

同一位置下,Properties 文件优先级高于 YAML 文件。

11、Spring Boot自动配置原理

Spring Boot的自动装配是基于Spring Factories机制实现的,Spring Factories机制是Spring Boot中的一种服务发现机制,spring.factories 文件本质上与 properties 文件相似,其中包含一组或多组键值对(key=vlaue),其中,key 的取值为接口的完全限定名;value 的取值为接口实现类的完全限定名,一个接口可以设置多个实现类,不同实现类之间使用“,”隔开。

Spring Factories实现原理:

spring-core 包里定义了 SpringFactoriesLoader 类,这个类会扫描所有 Jar 包类路径下的 META-INF/spring.factories 文件,并获取指定接口的配置。在 SpringFactoriesLoader 类中定义了两个对外的方法,

<T> List<T> loadFactories(Class<T> factoryType, @Nullable ClassLoader classLoader):获取指定接口的实现类对象;

List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader):根据接口获取实现类类名的集合;

(1)@SpringBootApplication注解:组合元注解(包括@SpringBootConfiguration和@EnableAutoConfiguration(自动化配置的核心所在));

(2)EnableAutoConfiguration注解:用于开启 Spring Boot 的自动配置功能, 它使用 Spring 框架提供的 @Import 注解通过 AutoConfigurationImportSelector类(选择器)给容器中导入自动配置组件。

AutoConfigurationImportSelector类:实现了DeferredImportSelector接口,AutoConfigurationImportSelector 中还包含一个静态内部类 AutoConfigurationGroup,它实现了 DeferredImportSelector 接口的内部接口 Group。

AutoConfigurationImportSelector 内各方法执行顺序如下。

  1. getImportGroup() 方法:用于获取实现了 DeferredImportSelector.Group 接口的类;

  2. process() 方法:通过调用 getAutoConfigurationEntry() 方法读取 spring.factories 文件中的内容,获得自动配置类的集合;getAutoConfigurationEntry() 方法通过调用 getCandidateConfigurations() 方法来获取自动配置类的完全限定名,并在经过排除、过滤等处理后,将其缓存到成员变量中;

  3. selectImports() 方法:获取自动配置类的完全限定名,并在经过排除、过滤等处理后,将其缓存到成员变量中。

12、Spring Boot统一日志框架

日志框架分为两类:

(1)日志门面(日志抽象层):为Java日志访问提供一套标准和规范的API框架,其主要意义在于提供接口,JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、jboss-logging;

(2)日志实现:日志门面的具体的实现,Log4j、JUL(java.util.logging)、Log4j2、Logback。

通常情况下,日志由一个日志门面与一个日志实现组合搭建而成,Spring Boot 选用 SLF4J + Logback 的组合来搭建日志系统。

统一日志框架(通用)

Spring Boot:slf4j+logback;

Spring:commons-logging;

Hibernate:jboss-logging;

统一日志框架一共需要以下 3 步 :

  1. 排除应用中的原来的日志框架;

  2. 引入替换包替换被排除的日志框架;

  3. 导入 SLF4J 实现。

统一日志框架(Spring Boot)

Spring Boot的核心启动器spring-boot-starter引入了spring-boot-starter-logging

spring-boot-starter-logging 的 Maven 依赖不但引入了 logback-classic (包含了日志框架 SLF4J 的实现),还引入了 log4j-to-slf4j(log4j 的替换包),jul-to-slf4j (JUL 的替换包),即 Spring Boot 已经为我们完成了统一日志框架的 3 个步骤中的 2 步。

13、Spring Boot日志配置及输出

默认配置:Spring Boot默认使用SLF4J+Logback记录日志(全局配置文件application.properties/yml);

日志级别(依次升高):

(1)trace:追踪,指明程序运行轨迹;

(2)debug:调试,实际应用中一般将其作为最低级别,而trace很少使用;

(3)info:输出重要的信息,使用较多;

(4)warn:警告,使用较多;

(5)error:错误信息,使用较多。

Spring Boot的默认日志级别:info,日志输出内容默认包含以下元素:

(1)时间日期;(2)日志级别;(3)进程PID;(4)分隔符:---;(5)线程名:方括号括起来(可能会截断控制台输出);(6)Logger名称;(7)日志内容;

自定义日志配置(普通日志配置文件和带有spring标识的日志配置文件):

Logback:logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy

Log4j2:log4j2-spring.xml、log4j2.xml

JUL(Java Util Logging):logging.properties

普通日志配置文件:我们将 logback.xml、log4j2.xml 等不带 spring 标识的普通日志配置文件,放在项目的类路径下后,这些配置文件会跳过 Spring Boot,直接被日志框架加载。通过这些配置文件,我们就可以达到自定义日志配置的目的。

带有spring标识的日志配置文件:Spring Boot 推荐用户使用 logback-spring.xml、log4j2-spring.xml 等这种带有 spring 标识的配置文件。这种配置文件被放在项目类路径后,不会直接被日志框架加载,而是由 Spring Boot 对它们进行解析,这样就可以使用 Spring Boot 的高级功能 Profile,实现在不同的环境中使用不同的日志配置。

14、spring-boot-starter-web(Web启动器)

Spring Boot提供了spring-boot-starter-web(Web场景启动器),而spring-boot-starter-web为我们提供了嵌入的Servlet容器以及Spring MVC的依赖。

Spring Boot 为 Spring MVC 提供了自动配置,并在 Spring MVC 默认功能的基础上添加了以下特性:

  • 引入了 ContentNegotiatingViewResolver 和 BeanNameViewResolver(视图解析器)

  • 对包括 WebJars 在内的静态资源的支持

  • 自动注册 Converter、GenericConverter 和 Formatter (转换器和格式化器)

  • 对 HttpMessageConverters 的支持(Spring MVC 中用于转换 HTTP 请求和响应的消息转换器)

  • 自动注册 MessageCodesResolver(用于定义错误代码生成规则)

  • 支持对静态首页(index.html)的访问

  • 自动使用 ConfigurableWebBindingInitializer

15、Spring Boot静态资源映射

Spring Boot 默认为我们提供了 3 种静态资源映射规则:

(1)WebJars 映射(WebJars以Jar形式为Web项目提供资源文件)

①、先将Web前端资源打成Jar包;

②、将Jar包部署到Maven中央仓库中进行统一管理;

③、当 Spring Boot 项目中需要引入 Web 前端资源时,只需要访问 WebJars 官网,找到所需资源的 pom 依赖,将其导入到项目中即可。

(2)默认资源映射

当访问项目中的任意资源(即“/**”)时,Spring Boot 会默认从以下路径中查找资源文件(也叫静态资源文件夹,优先级依次降低):

  1. classpath:/META-INF/resources/

  2. classpath:/resources/

  3. classpath:/static/

  4. classpath:/public/

(3)静态首页(欢迎页)映射

静态资源文件夹下的所有 index.html 被称为静态首页或者欢迎页,它们会被被 /** 映射,换句话说就是,当我们访问“/”或者“/index.html”时,都会跳转到静态首页(欢迎页),静态首页也遵循静态资源的查找顺序。

16、Spring Boot定制Spring MVC

Spring Boot 抛弃了传统 xml 配置文件,通过配置类(标注 @Configuration 的类,相当于一个 xml 配置文件)以 JavaBean 形式进行相关配置。

Spring Boot 对 Spring MVC 的自动配置可以满足我们的大部分需求,但是我们也可以通过自定义配置类(标注 @Configuration 的类)并实现 WebMvcConfigurer 接口来定制 Spring MVC 配置,例如拦截器、格式化程序、视图控制器等等。

WebMvcConfigurer 接口的几个方法:

(1)default void addInterceptors(InterceptorRegistry registry) {}:添加 Spring MVC 生命周期拦截器,对请求进行拦截处理;

(2)default void addResourceHandlers(ResourceHandlerRegistry registry) {}:添加或修改静态资源(例如图片,js,css 等)映射,Spring Boot 默认设置的静态资源文件夹就是通过重写该方法设置的;

(3)default void addViewControllers(ViewControllerRegistry registry) {}:主要用于实现无业务逻辑跳转,例如主页跳转,简单的请求重定向,错误页跳转等;

Spring Boot项目中的两种形式的Spring MVC:

(1)扩展Spring MVC:标注 @Configuration,但不标注 @EnableWebMvc 注解的类来扩展 Spring MVC。这样不但能够保留 Spring Boot 对 Spring MVC 的自动配置,享受 Spring Boot 自动配置带来的便利,还能额外增加自定义的 Spring MVC 配置。

(2)全面接管Spring MVC:自定义一个 WebMvcConfigurer 类型(实现 WebMvcConfigurer 接口)的配置类,并在该类上标注 @EnableWebMvc 注解,来实现完全接管 Spring MVC。

注意:完全接管 Spring MVC 后,Spring Boot 对 Spring MVC 的自动配置将全部失效。

17、Thymeleaf——新一代 Java 模板引擎

Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。它与 JSP,Velocity,FreeMaker 等模板引擎类似,也可以轻易地与 Spring MVC 等 Web 框架集成。与其它模板引擎相比,Thymeleaf 最大的特点是,即使不启动 Web 应用,也可以直接在浏览器中打开并正确显示模板页面 。

(1)Thymeleaf简介

Thymeleaf 是新一代 Java 模板引擎,与 Velocity、FreeMarker 等传统 Java 模板引擎不同,Thymeleaf 支持 HTML 原型,其文件后缀为“.html”,因此它可以直接被浏览器打开,此时浏览器会忽略未定义的 Thymeleaf 标签属性,展示 thymeleaf 模板的静态页面效果;当通过 Web 应用程序访问时,Thymeleaf 会动态地替换掉静态内容,使页面动态显示。

Thymeleaf的特点:

  • 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。

  • 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

  • 多方言支持:它提供了 Thymeleaf 标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、 OGNL 表达式;必要时,开发人员也可以扩展和创建自定义的方言。

  • 与 SpringBoot 完美整合:SpringBoot 为 Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 设置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合。

(2)Thymeleaf语法规则

①、标准表达式语法

Thymeleaf 模板引擎支持多种表达式:

  • 变量表达式:${...}

  • 选择变量表达式:*{...}

  • 链接表达式:@{...}

  • 国际化表达式:#{...}

  • 片段引用表达式:~{...}

②、th属性

(3)Thymeleaf公共页面抽取

①、抽取公共页面

将公共页面片段抽取出来,存放在 commons.html 中:

<div th:fragment="fragment-name" id="fragment-id">

<span>公共页面片段</span>

</div>

②、引用公共页面

在 Thymeleaf 中,我们可以使用以下 3 个属性,将公共页面片段引入到当前页面中。

  • th:insert:将代码块片段整个插入到使用了 th:insert 属性的 HTML 标签中;

  • th:replace:将代码块片段整个替换使用了 th:replace 属性的 HTML 标签中;

  • th:include:将代码块片段包含的内容插入到使用了 th:include 属性的 HTML 标签中。

③、传递参数

Thymeleaf 在抽取和引入公共页面片段时,还可以进行参数传递,大致步骤如下:

  1. 传入参数;

    引用公共页面片段时,我们可以通过以下 2 种方式,将参数传入到被引用的页面片段中:

    • 模板名::选择器名或片段名(参数1=参数值1,参数2=参数值2)

    • 模板名::选择器名或片段名(参数值1,参数值2)

      若传入参数较少时,一般采用第二种方式,直接将参数值传入页面片段中;

      若参数较多时,建议使用第一种方式,明确指定参数名和参数值,。

  2. 使用参数;

    在声明页面片段时,我们可以在片段中声明并使用这些参数。

18、Spring Boot整合Thymeleaf

Spring Boot 推荐使用 Thymeleaf 作为其模板引擎。SpringBoot 为 Thymeleaf 提供了一系列默认配置,项目中一但导入了 Thymeleaf 的依赖,相对应的自动配置 (ThymeleafAutoConfiguration 或 FreeMarkerAutoConfiguration) 就会自动生效,因此 Thymeleaf 可以与 Spring Boot 完美整合 。

Spring Boot 整合 Thymeleaf 模板引擎,需要以下步骤:

  1. 引入 Starter 依赖

  2. 创建模板文件,并放在在指定目录下


版权声明:本文为qingmengrao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。