介绍Spring Boot
Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用程序。我们对Spring平台和第三方库进行了一种封装,其允许内嵌Tomcat服务器,可以轻松上手。
使用yml格式配置文件,大多数Spring Boot应用程序只需要很少的Spring配置。您可以使用Spring Boot创建可以使用java -jar或更传统的war部署启动的Java应用程序。
Spring Boot 可以做到开箱即用,为所有Spring开发提供从根本上更快且可广泛访问的入门体验。
Spring Boot不需要任何特殊工具集成,因此您可以使用任何IDE或文本编辑器。此外,Spring Boot应用程序没有什么特别之处,因此您可以像运行任何其他Java程序一样使用JUnit4.12(必须4.12版本以上)、SpringBootTest(是对JUnit的一个封装)或在main方法中运行和调试Spring Boot应用程序。
配置要求
Spring Boot版本
当前Spring Boot 各版本(一般选带GA的):
Spring Boot 2.1.5.RELEASE需要Java 8,并且与Java 11兼容(包括在内)。还需要Spring Framework 5.1.7.RELEASE或更高版本。
构建工具版本
为以下构建工具提供了显式构建支持:
- Maven 3.3+
- Gradle 4.4+
对应的Servlet容器版本
Spring Boot支持以下嵌入式Servlet容器:
Name => Servlet Version
- Tomcat 9.0 => 4.0
- Jetty 9.4 => 3.1
- Undertow 2.0 => 4.0
可以将Spring Boot应用程序部署到任何Servlet 3.1+兼容容器,Tomcat8.5.4x就可以了。
Maven配置
pom.xml项目对象模型
<?xml version =“1.0” encoding =“UTF-8”?>
<project xmlns = “http://maven.apache.org/POM/4.0.0” xmlns:xsi = “http://www.w3 .org / 2001 / XMLSchema-instance“
xsi:schemaLocation = ”http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd“ >
<modelVersion> 4.0.0 </ modelVersion>
<groupId> com.example </ groupId>
<artifactId> myproject </ artifactId>
<version> 0.0.1-SNAPSHOT </ version>
<! - 从Spring Boot继承默认值 - - >
<parent>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot-starter-parent </ artifactId>
<version> 2.1.5.RELEASE </ version>
<!--继承Starter Parent后,只需要在此依赖项上指定Spring Boot版本号。如果导入其他启动器,则可以省略版本号的配置,maven会自动导入符合2.1.5.RELEASE版本的各种依赖-->
</ parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<! - 添加Web应用程序的典型依赖项 - >
<dependencies>
<dependency>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot-starter-web </ artifactId>
</ dependency>
</ dependencies>
<! - 可以将项目打包为可执行 jar 的一个Maven插件- >
<build>
< plugins>
<plugin>
<groupId> org.springframework.boot </ groupId>
<artifactId>spring-boot-maven-plugin </ artifactId>
</ plugin>
</ plugins>
</ build>
</ project>
通过上面继承spring boot的默认设置,您还可以通过覆盖自己项目中的属性来覆盖单个依赖项。例如,要升级到另一个Spring Data版本系列,您需要将以下内容添加到pom.xml:
<properties>
<spring-data-releasetrain.version>
Fowler-SR2
</spring-data-releasetrain.version>
</ properties>
获取支持的属性列表(继承自 spring boot 默认配置)
如果您不想使用spring-boot-starter-parent,您仍然可以通过使用scope=import依赖项来保持依赖项管理
<dependencyManagement>
<dependencies>
<dependency>
<! - 从Spring Boot导入依赖关系管理 - >
<groupId> org.springframework.boot </ groupId>
<!-- 核心(这个其实就是包含配置spring boot项目所需要的各种依赖信息,与上面parent不同的是,这里只是提供依赖信息,并没有引入,要想覆盖其中包含的某个依赖信息的版本,需在这个声明之前声明,如下:) -->
<artifactId>spring-boot-dependencies</ artifactId>
<version> 2.1 .5.RELEASE </ version>
<type> pom </ type>
<scope> import </ scope>
</ dependency>
</ dependencies>
</ dependencyManagement>
<dependencyManagement>
<dependencies>
<! - 覆盖Spring Boot提供的Spring Data版本系列 - >
<dependency>
<groupId> org.springframework.data </ groupId>
<artifactId> spring-data-releasetrain </ artifactId>
< version> Fowler-SR2 </ version>
<type> pom </ type>
<scope> import </ scope>
</ dependency>
<dependency>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot -dependencies </ artifactId>
<version>2.1.5.RELEASE </ version>
<type> pom</ type>
<scope> import </ scope>
</ dependency>
</ dependencies>
</ dependencyManagement>
spring-boot-starter-*
类似spring-boot-starter-*的被称为启动器,是一组方便的依赖关系描述符,所有官方首发都遵循类似的命名模式。第三方启动者不应该开头spring-boot,因为它是为官方Spring Boot工件保留的。相反,第三方启动器通常以项目名称开头。
表13.1。Spring Boot应用程序启动器
名称 | 描述 | POM |
---|---|---|
核心启动器,包括自动配置支持,日志记录和YAML | ||
使用Apache ActiveMQ进行JMS消息传递的入门者 | ||
使用Spring AMQP和Rabbit MQ的入门者 | ||
使用Spring AOP和AspectJ进行面向方面编程的入门者 | ||
使用Apache Artemis进行JMS消息传递的入门者 | ||
使用Spring Batch的入门者 | ||
使用Spring Framework的缓存支持的初学者 | ||
使用Spring Cloud Connectors的初学者简化了Cloud Foundry和Heroku等云平台中的服务连接 | ||
使用Cassandra分布式数据库和Spring Data Cassandra的入门者 | ||
使用Cassandra分布式数据库和Spring Data Cassandra Reactive的入门者 | ||
使用Couchbase面向文档的数据库和Spring Data Couchbase的入门者 | ||
使用Couchbase面向文档的数据库和Spring Data Couchbase Reactive的入门者 | ||
使用Elasticsearch搜索和分析引擎以及Spring Data Elasticsearch的初学者 | ||
使用Spring Data JDBC的入门者 | ||
将Spring Data JPA与Hibernate一起使用的初学者 | ||
使用Spring Data LDAP的入门者 | ||
使用MongoDB面向文档的数据库和Spring Data MongoDB的初学者 | ||
使用MongoDB面向文档的数据库和Spring Data MongoDB Reactive的入门者 | ||
使用Neo4j图形数据库和Spring Data Neo4j的入门者 | ||
在Spring Data Redis和Lettuce客户端上使用Redis键值数据存储的初学者 | ||
使用带有Spring Data Redis被动的Redis键值数据存储和Lettuce客户端的入门者 | ||
使用Spring Data REST通过REST公开Spring Data存储库的入门者 | ||
在Spring Data Solr中使用Apache Solr搜索平台的初学者 | ||
使用FreeMarker视图构建MVC Web应用程序的入门者 | ||
使用Groovy模板视图构建MVC Web应用程序的入门者 | ||
使用Spring MVC和Spring HATEOAS构建基于超媒体的RESTful Web应用程序的入门者 | ||
使用Spring Integration的入门者 | ||
将JDBC与HikariCP连接池一起使用的入门者 | ||
使用JAX-RS和Jersey构建RESTful Web应用程序的初学者。替代 | ||
使用jOOQ访问SQL数据库的初学者。替代 | ||
阅读和写作json的初学者 | ||
使用Atomikos进行JTA交易的入门者 | ||
使用Bitronix进行JTA事务的入门者 | ||
使用Java Mail和Spring Framework的电子邮件发送支持的入门者 | ||
使用Mustache视图构建Web应用程序的入门者 | ||
使用Spring Security的OAuth2 / OpenID Connect客户端功能的入门者 | ||
使用Spring Security的OAuth2资源服务器功能的入门者 | ||
使用Quartz调度程序的入门者 | ||
使用Spring Security的入门者 | ||
使用JUnit,Hamcrest和Mockito等库来测试Spring Boot应用程序的初学者 | ||
使用Thymeleaf视图构建MVC Web应用程序的入门者 | ||
使用Java Bean Validation和Hibernate Validator的初学者 | ||
使用Spring MVC构建Web(包括RESTful)应用程序的入门者。使用Tomcat作为默认嵌入式容器 | ||
使用Spring Web Services的入门者 | ||
使用Spring Framework的Reactive Web支持构建WebFlux应用程序的初学者 | ||
使用Spring Framework的WebSocket支持构建WebSocket应用程序的初学者 |
表13.3。Spring Boot技术首发
名称 | 描述 | POM |
---|---|---|
使用Jetty作为嵌入式servlet容器的入门。替代 | ||
使用Log4j2进行日志记录的入门。替代 | ||
使用Logback进行日志记录的入门。默认日志启动器 | ||
使用Reactor Netty作为嵌入式响应式HTTP服务器的入门者。 | ||
使用Tomcat作为嵌入式servlet容器的入门者。使用的默认servlet容器启动器 | ||
使用Undertow作为嵌入式servlet容器的入门者。替代 |
@SpringBootApplication
通常不鼓励使用“默认包”,应该避免使用。这可能会导致使用了Spring启动应用程序的特殊问题@ComponentScan,@EntityScan或@SpringBootApplication注解,因为每个class都是从jar中被读取的。
建议遵循Java推荐的包命名约定并使用反向域名(例如,com.example.project)
通常建议您将主应用程序类放在其他类之上的根包中:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
该@SpringBootApplication注解往往放在你的主类,它隐含地定义为某些项目基础的“搜索包”。例如,如果您正在编写JPA应用程序,@SpringBootApplication则使用注解annotation的类的包来搜索@Entity项目。使用根包还允许组件扫描仅应用于您的项目。
如果您不想使用@SpringBootApplication,它导入的@EnableAutoConfiguration 和@ComponentScan注释会定义该行为,因此您也可以使用它们来替代。
配置文件或配置类
@Configuration 定义配置类
@import 用于导入额外的配置类
@ComponentScan 自动获取所有Spring组件,包括 @Configuration类
@importResource 加载XML配置文件
@SpringBootApplication或@EnableAutoConfiguration(只能选一个) Spring Boot自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB 在您的类路径上,并且您尚未手动配置任何数据库连接bean,则Spring Boot会自动配置内存数据库。
自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置以替换自动配置的特定部分。例如,如果添加自己的DataSourcebean,则默认的嵌入式数据库支持会退回。
- 禁用特定的自动配置类
import org.springframework.boot.autoconfigure。*;
import org.springframework.boot.autoconfigure.jdbc。*;
import org.springframework.context.annotation。*;
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
Spring Beans和依赖注入
@Autowired依赖注入
以下示例显示了一个@Service使用构造函数注入来获取所需RiskAssessorbean的Bean:
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
上面由于有构造函数,所以可以省略@Autowired(spring framework中可以根据配置文件通过构造方法或setter方法进行依赖注入,可能是spring boot这里对此进行了增强吧:T)
各种常用@*组件
@SpringBootApplication注释是相当于使用@Configuration, @EnableAutoConfiguration以及@ComponentScan
-
@EnableAutoConfiguration:启用Spring Boot的自动配置机制
-
@ComponentScan:@Component在应用程序所在的包上启用扫描
-
@Configuration:允许在上下文中注册额外的bean或导入其他配置类
在根包中定位应用程序类,则可以添加@ComponentScan(@SpringBootApplication已包含)不带任何参数的代码。您的所有应用程序组件都将被注册为spring bean:
- @Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
- @Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
- @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
- @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
- @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
可以不使用@SpringBootApplication,而可以自定义:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
application.yml配置
一般默认生成的项目配置文件为application.properties,其使用key:value的方式进行配置,但如今比较流行application.yml的yml文件配置,因其使用分层、缩进的格式,提高了配置文件的可读性。如:
server:
port: 8080
系统运行时,读取配置文件的的顺序一般为:
- 根目录下的config目录中的application.yml
- 根目录下的application.yml
- resources目录下的config目录中的application.yml
- resources目录下的application.yml
注意:如果两个地方都配置了配置文件,其中后面的配置不会覆盖前面的配置信息,系统会先读取前面的配置信息,然后再读取后面的配置信息(其中忽略掉已读取过的配置信息,也就是说如果前面的配置文件中没有配置端口server.port,则若后面的配置文件中配置了server.port=8081,则会生效(8080为默认端口))
运行程序
打包成jar运行
将应用程序打包为jar并使用嵌入式HTTP服务器的最大优势之一是,您可以像运行任何其他应用程序一样运行应用程序。调试Spring Boot应用程序也很容易。您不需要任何特殊的IDE插件或扩展。
如果使用Spring Boot Maven或Gradle插件创建可执行jar,则可以使用运行应用程序java -jar,如以下示例所示:
- java -jar target / myapplication-0.0.1-SNAPSHOT.jar
使用Maven运行
配置系统环境变量:
- export MAVEN_OPTS = -Xmx1024m
快速编译和运行应用程序:
- mvn spring-boot:run
热插拔
可以使用JRebel,要加入spring-boot-devtools模块
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<!-- 依赖项标记为Maven中的可选项 是防止devtools过渡传递到项目的其他模块-->
</dependency>
</dependencies>
运行完全打包的应用程序时会自动禁用开发人员工具。如果您的应用程序是从java -jar特殊的类加载器启动或启动的,那么它将被视为“生产应用程序”。如果这不适用于您(即,如果您从容器运行应用程序,也就是已经打包好了,不是开发状态了),请考虑排除devtools或设置-Dspring.devtools.restart.enabled=false系统属性。
缓存
Spring Boot支持的几个库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。此外,Spring MVC可以在提供静态资源时为响应添加HTTP缓存标头。虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,使您无法看到刚刚在应用程序中进行的更改。因此,spring-boot-devtools默认禁用缓存选项。
缓存选项通常由application.properties文件中的设置配置。例如,Thymeleaf提供spring.thymeleaf.cache设置是否缓存。该spring-boot-devtools模块不需要手动设置这些属性,而是自动应用合理的这些配置。
触发重启restart和快速重装reload
某些资源在更改时不一定需要触发重启。例如,可以就地编辑Thymeleaf模板。默认情况下,在改变资源/META-INF/maven,/META-INF/resources,/resources,/static,/public,或 /templates不会触发重启但并引发LiveReload。如果要自定义这些排除项,可以使用该spring.devtools.restart.exclude属性。例如,要仅排除/static,/public您将设置以下属性:
spring.devtools.restart.exclude=static/ **,public/ **
如果要保留这些默认值并添加其他排除项,请改用该 spring.devtools.restart.additional-exclude属性。(自定义添加重启目录可以设置:spring.devtools.restart.additional-paths)
该spring-boot-devtools模块包括一个嵌入式LiveReload服务器,可用于在更改资源时触发浏览器刷新。LiveReload浏览器扩展程序可从livereload.com免费用于Chrome,Firefox和Safari 。
如果您不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false
若喜欢仅在特定时间触发重新启动,可以使用“触发器文件”。这是一个特殊文件,当您想要实际触发重新启动检查时,必须对其进行修改。可以设置
spring.devtools.restart.trigger-file属性设置为触发器文件的路径
全局设置
您可以通过添加一个文件名为配置全局devtools设置 .spring-boot-devtools.properties到你的$HOME文件夹(注意:文件名开头“.”)。添加到此文件的任何属性都适用于计算机上使用devtools的所有 Spring Boot应用程序。例如,要将restart配置为始终使用 触发器文件,您需要添加以下属性:
〜/.spring-boot-devtools.properties文件中:
spring.devtools.restart.trigger-file=文件路径
激活的配置文件.spring-boot-devtools.properties不会影响特定于配置文件的配置文件的加载
禁用devtools
设置application.properties中的spring.devtools.restart.enabled=false(这样做仍会初始化重新启动的类加载器,但它不会监视文件更改)。要完全禁用则可以:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
评论区