想要快速入门架构师怎么办?!吴需烦恼!华为架构师教你三分钟了解 Spring Boot!
一、简介
使用 Spring Boot
可以很容易地创建出能直接运行的独立的、生产级别的基于 Spring 的应用。我们对 Spring
平台和第三方类库有自己的考虑,因此您可以从最基本的开始。大多数 Spring Boot
应用只需要很少的 Spring 配置。
您可以使用 Spring Boot
来创建一个可以使用 java -jar
命令来运行或者基于传统的 war 包部署的应用程序。我们还提供了一个用于运行 spring scripts
的命令行工具。
我们的主要目标是:
- 为所有
Spring Boot
开发提供一个更快、更全面的入门体验。 - 坚持自我虽好,但当需求出现偏离,您需要能迅速摆脱出来。
- 提供大量非功能性特性相关项目(例如:内嵌服务器、安全、指标、健康检查、外部配置)。
- 绝对没有代码生成,也不要求
XML 配置
。
Spring
二、创建可执行 jar
要创建可执行 jar
,我们需要将 spring-boot-maven-plugin
添加到 pom.xml
文件中。在 dependencies
下方插入以下配置:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
三、使用Spring Boot
3.1 Maven
Maven
用户可以继承spring-boot-starter-parent
项目以获取合适的默认值,父项目提供了以下功能:
Java 1.8
作为默认编译器级别。- 源代码使用
UTF-8
编码。 - 依赖管理部分继承自
spring-boot-dependencies
的POM
,允许您省略常见依赖的标签。 - 合理的资源过滤。
- 合适的插件配置(
exec plugin
、Git commit ID
、shade
)。 - 针对
application.properties
和application.yml
资源的合理过滤,包括特定profile
的文件(例如application-foo.properties
和application-foo.yml
)
3.1.1 继承Starter Parent
要将项目配置继承 spring-boot-starter-parent
,只需要按以下方式设置parent
:
<!-- 从 Spring Boot 继承默认配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
3.2、Starter
Starter
是一组惯例依赖描述资源,可以包含在应用中。从 starter 中,您可以获得所需的所有 Spring
和相关技术的一站式支持,无须通过示例代码和复制粘贴来获取依赖。比如,如果您要使用 Spring 和 JPA 进行数据库访问,那么只需要在项目中包含 spring-boot-starter-data-jpa
依赖项即可。
Spring Boot
在 org.springframework.boot group
下提供了以下应用 starter
:
3.2.1 Spring Boot 应用类 Starter
名称 | 描述 |
---|---|
spring-boot-starter | 核心 starter,包含自动配置支持、日志和 YAML |
spring-boot-starter-activemq | 提供 JMS 消息支持,使用 Apache ActiveMQ |
spring-boot-starter-amqp | 提供 Spring AMQP 与 Rabbit MQ 支持 |
spring-boot-starter-aop | 提供 Spring AOP 与 AspectJ 面向切面编程支持 |
spring-boot-starter-artemis | 提供 JMS 消息服务支持,使用 Apache Artemis |
spring-boot-starter-batch | 提供 Spring Batch 支持 |
spring-boot-starter-cache | 提供 Spring Framework 缓存支持 |
spring-boot-starter-cloud-connectors | 使用 Spring Cloud Connectors 简单连接到类似 Cloud Foundry 和 Heroku 等云平台 |
spring-boot-starter-data-cassandra | 提供对 Cassandra 分布式数据库和 Spring Data Cassandra 的支持 |
spring-boot-starter-data-cassandra-reactive | 提供对 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的支持 |
spring-boot-starter-data-couchbase | 提供对 Couchbase 面向文档数据库和 Spring Data Couchbase 的支持 |
pring-boot-starter-data-couchbase-reactive | 提供对 Couchbase 面向文档数据库和 Spring Data Couchbase Reactive 的支持 |
spring-boot-starter-data-elasticsearch | 提供对 Elasticseach 搜索与分析引擎和 Spring Data Elasticsearch 的支持 |
spring-boot-starter-data-jpa | 供 Spring Data JPA 与 Hibernate 的支持 |
spring-boot-starter-data-mongodb | 提供对 MongoDB 面向文档数据库和 Spring Data MongoDB 的支持 |
spring-boot-starter-data-mongodb-reactive | 提供对 MongoDB 面向文档数据库和 Spring Data MongoDB Reactive 的支持 |
spring-boot-starter-data-neo4j | 提供对 Neo4j 图数据库与 SPring Data Neo4j 的支持 |
spring-boot-starter-data-redis | 提供对 Redis 键值数据存储、Spring Data Redis 和 Lettuce 客户端的支持 |
spring-boot-starter-data-redis-reactive | 提供对 Redis 键值数据存储、Spring Data Redis Reactive 和 Lettuce 客户端的支持 |
spring-boot-starter-data-rest | 提供使用 Spring Data REST 通过 REST 暴露 Spring Data 资源库的支持 |
spring-boot-starter-freemarker | 提供使用 Freemakrer 视图构建 MVC web 应用的支持 |
spring-boot-starter-jdbc | 提供 JDBC 与 Tomcat JDBC 连接池的支持 |
spring-boot-starter-json | 提供了读写 json 的支持 |
spring-boot-starter-mail | 提供使用 Java Mail 与 Spring Framework 的邮件发送支持 |
spring-boot-starter-security | Spring Security 支持 |
spring-boot-starter-test | 供包含了 JUnit、Hamcrest 与 Mockito 类库的 Spring Boot 单元测试支持 |
spring-boot-starter-thymeleaf | 提供使用 Thymeleaf 视图构建 MVC web 应用的支持 |
spring-boot-starter-validation | 提供 Hibernate Validator 与 Java Bean Validation 的支持 |
spring-boot-starter-web | 提供使用 Spring MVC 构建 web(包含 RESTful)应用的支持,使用 Tomcat 作为默认嵌入式容器 |
spring-boot-starter-web-services | Spring Web Services 支持 |
spring-boot-starter-webflux | 提供使用 Spring Framework 的 Reactive Web 支持构建 WebFlux 应用的支持 |
spring-boot-starter-websocket | 提供使用 Spring Framework 的 WebSocket 支持构建 WebSocket 应用的支持 |
3.2.2 Spring Boot技术类 starter
名称 | 描述 |
---|---|
spring-boot-starter-jetty | 使用 Jetty 作为嵌入式 servlet 容器。可代替 spring-boot-starter-tomcat |
spring-boot-starter-log4j2 | 使用 Log4j2 作为日志组件。可代替 spring-boot-starter-logging |
spring-boot-starter-logging | 使用 Logback 作为日志组件,此 starter 为默认的日志 starter |
spring-boot-starter-reactor-netty | 使用 Reactor Netty 作为内嵌响应式 HTTP 服务器 |
spring-boot-starter-tomcat | 使用 Tomcat 作为嵌入式 servlet 容器,此为 spring-boot-starter-web 默认的 servlet 容器 starter |
spring-boot-starter-undertow | 使用 Undertow 作为嵌入式 servlet 容器,可代替 spring-boot-starter-tomcat |
3.3 使用@SpringBooApplication注解
很多 Spring Boot
开发者总是使用 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
注解标记在主类上。由于 这些注解经常一起使用。Spring Boot 提供了一个更方便的 @SpringBootApplication
注解可用来替代这个组合。
@SpringBootApplication
注解相当于使用 @Configuration、@EnableAutoConfiguration
和@ComponentScan
及他们的默认属性:
package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
加入Java开发交流君样:484138291一起吹水聊天
@SpringBootApplication // 相当于使用 @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
四、SpringBoot 特性
4.1 自定义banner
可以通过在 classpath
下添加一个banner.txt
文件,或者将 spring.banner.location
属性指向该文件的位置来更改启动时打印的banner
。如果文件采用了非 UTF-8
编码,您可以设置 spring.banner.charset 来解决。除了文本文件,您还可以将 banner.gif
、banner.jpg
或者 banner.png
图片文件添加到classpath
下,或者设置 spring.banner.image.location
属性。指定的图片将会被转换成 ASCII
形式并打印在 banner
文本上方。
变量 | 描述 |
---|---|
${application.version} | 您的应用版本号,声明在 MANIFEST.MF 中。例如,Implementation-Version: 1.0 将被打印为 1.0。 |
${application.formatted-version} | 您的应用版本号,声明在 MANIFEST.MF 中,格式化之后打印(用括号括起来,以 v 为前缀),例如 (v1.0)。 |
${spring-boot.version} | 您使用的 Spring Boot 版本。例如 2.1.1.RELEASE. 。 |
${spring-boot.formatted-version} | 您使用的 ~Spring Boot ~版本格式化之后显示(用括号括起来,以 v 为前缀)。例如 (v2.1.1.RELEASE )。 |
$ {Ansi.NAME}(或
A
n
s
i
C
o
l
o
r
.
N
A
M
E
‘
、
{AnsiColor.NAME`}、
AnsiColor.NAME‘、 {AnsiBackground.NAME}、$ {AnsiStyle.NAME }) | 其中NAME 是 ANSI 转义码的名称。有关详细信息,请参阅 AnsiPropertySource`。 | |
${application.title} | 您的应用标题,声明在 MANIFEST.MF 中,例如Implementation-Title: MyApp 打印为 MyApp 。 |
注意
YAML 将 off 映射为 false,因此如果要禁用应用程序 banner,请确保属性添加引号。
spring:
main:
banner-mode: "off"
4.2 外部化配置
Spring Boot
可以让您的配置外部化,以便可以在不同环境中使用相同的应用程序代码。您可以使用properties
文件、YAML
文件、环境变量或者命令行参数来外部化配置。可以使用 @Value
注解将属性值直接注入到 bean 中,可通过 Spring
的 Environment
访问,或者通过 @ConfigurationProperties
绑定到结构化对象。
Spring Boot
使用了一个非常特别的 PropertySource
指令,用于智能覆盖默认值。属性将按照以下顺序处理:
- 在您的主目录(当
devtools
被激活,则为 ~/.spring-boot-devtools.properties
)中的Devtools
全局设置属性。 - 在测试中使用到的
@TestPropertySource
注解。 - 在测试中使用到的
properties
属性,可以是SpringBootTest
和用于测试应用程序某部分的测试注解。【获取资料】 - 命令行参数。
- 来自
SPRING_APPLICATION_JSON
的属性(嵌入在环境变量或者系统属性【system propert】
中的内联JSON
)。 ServletConfig
初始化参数。ServletContext
初始化参数。- 来自
java:comp/env
的 JNDI 属性。 Java
系统属性(System.getProperties())。- 操作系统环境变量。
- 只有
random.*
属性的RandomValuePropertySource
。 - 在已打包的 jar 外部的指定 profile 的应用属性文件(application-{profile}.properties 和 YAML 变量)。
- 在已打包的 jar 内部的指定
profile
的应用属性文件(application-{profile}.propertie
s 和YAML
变量)。 - 在已打包的 jar 外部的应用属性文件(
application.properties
和YAML
变量)。 - 在已打包的 jar 内部的应用属性文件(
application.properties
和YAML
变量)。 - 在
@Configuration
类上的@PropertySource
注解。 - 默认属性(使用
SpringApplication.setDefaultProperties
指定)。
举个例子,假设开发的 @Component
使用了 name
属性,可以这样:
import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;
@Component
public class MyBean {
加入Java开发交流君样:484138291一起吹水聊天
@Value("${name}")
private String name;
// ...
}
在您的应用程序的 classpath
中(比如在 jar 中),您可以有一个 application.properties
,它为 name
提供了一个合适的默认属性值。当在新环境中运行时,您可以在 jar 外面提供一个 application.properties
来覆盖 name
。对于一次性测试,您可以使用命令行指定形式启动(比如 java -jar app.jar --name="Spring"
)。
4.3 @ConfigurationProperties验证
只要使用了 Spring
的 @Validated
注解,Spring Boot
就会尝试验证 @ConfigurationProperties
类。您可以直接在配置类上使用 JSR-303 javax.validation
约束注解。为此,请确保 JSR-303 实现在 classpath
上,然后将约束注解添加到字段上,如下所示:
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
加入Java开发交流君样:484138291一起吹水聊天
@NotNull
private InetAddress remoteAddress;
// ... getters and setters
}
虽然绑定时也会验证嵌套属性,但最好的做法还是将关联字段注解上 @Valid
。这可确保即使未找到嵌套属性也会触发验证。以下示例基于前面的 AcmeProperties
示例:
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
@Valid
private final Security security = new Security();
// ... getters and setters
加入Java开发交流君样:484138291一起吹水聊天
public static class Security {
@NotEmpty
public String username;
// ... getters and setters
}
}
您还可以通过创建一个名为 configurationPropertiesValidator
的bean
定义来添加自定义 Spring Validator
。应该将@Bean
方法声明为 static。配置属性验证器在应用程序生命周期的早期创建,将 @Bean
方法声明为 static
可以无需实例化 @Configuration
类来创建 bean
。这样做可以避免早期实例化可能导致的意外问题。这里有一个属性验证示例,讲解了如何设置。
4.4 @ConfigurationProperties 与 @Value 对比
@Value
注解是核心容器功能,它不提供与类型安全配置属性相同的功能。下表总结了 @ConfigurationProperties
和 @Value
支持的功能:
功能 | @ConfigurationProperties | @Value |
---|---|---|
宽松绑定 | 是 | 否 |
元数据支持 | 是 | 否 |
SpEL 表达式 | 否 | 是 |
分类: Spring Boot
最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。
可以的话请给我一个三连支持一下我哟???【获取资料】