6.1.3. Gradle
要了解如何使用 Spring Boot 和 Gradle,请查看 Spring Boot 的 Gradle 插件文档:
6.1.4. Ant
搭建 Spring Boot 项目可以使用Apache的Ant + lvy。spring-boot-antlib
模块也有助于Ant创建可执行的jar包。
要声明依赖关系,一个典型的ivy.xml
文件如下所示:
<ivy-module version="2.0">
<info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
<configurations>
<conf name="compile" description="everything needed to compile this module" />
<conf name="runtime" extends="compile" description="everything needed to run
this module" />
</configurations>
<dependencies>
<dependency org="org.springframework.boot" name="spring-boot-starter"
rev="${spring-boot.version}" conf="compile" />
</dependencies>
</ivy-module>
一个典型的build.xml
文件如下所示:
<project
xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:spring-boot="antlib:org.springframework.boot.ant"
name="myapp" default="build">
<property name="spring-boot.version" value="2.7.2" />
<target name="resolve" description="--> retrieve dependencies with ivy">
<ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
</target>
<target name="classpaths" depends="resolve">
<path id="compile.classpath">
<fileset dir="lib/compile" includes="*.jar" />
</path>
</target>
<target name="init" depends="classpaths">
<mkdir dir="build/classes" />
</target>
<target name="compile" depends="init" description="compile">
<javac srcdir="src/main/java" destdir="build/classes"
classpathref="compile.classpath" />
</target>
<target name="build" depends="compile">
<spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
<spring-boot:lib>
<fileset dir="lib/runtime" />
</spring-boot:lib>
</spring-boot:exejar>
</target>
</project>
Tip
如果您不想使用spring-boot-antlib
模块,请查看 How-to Guides 中的 Build an Executable Archive from Ant without Using spring-boot-antlib”
6.1.5. Starters
启动器是一套方便的依赖描述符,可以将其包含在应用程序中。您可以获得所有 Spring 和其相关技术的一站式服务,而不需要查找示例代码并且复制粘贴大量的依赖描述符。例如,如果您想要使用 Spring 和 JPA 来进行数据库访问,请在项目中包含 spring-boot-starter-data-jpa
启动器
启动器包含许多快速启动和运行项目所需的依赖,并且具有一致的、受支持的托管依赖传递关系
在一个名称里的东西是什么?
所有的官方启动器都遵循一个类似的命名模板: spring-boot-starter-*
,*
是一个独特的应用类型。这种命名结构旨在当需要找到启动器时提供帮助。大部分的 IDE 中集成的 Maven 允许按名称查找依赖,例如,安装了合适的 Eclipse 或者是 Spring Tools 插件后,在 POM 编辑器中按 ctrl + space 键入“ spring-boot-starter ”可以获得完整的依赖列表。
正如“Creating Your Own Starter”(创造自己的启动器)所言,第三方启动器不应该以spring-boot
开头,因为这是为Spring Boot官方依赖所保留的。当然,一个第三方启动器常常会以项目的名称作为开头(所以一般不用担心)。比如,一个叫做thirdpartproject
的第三方项目将会毫无疑问地以thirdpartproject-spring-boot-starter
命名
Spring Boot 的org.springframework.boot
分组提供下面的应用启动器:
表1.Spring Boot应用启动器
Name | Description |
---|
spring-boot-starter | Spring Boot的核心启动器,包含自动配置支持,日志记录和YAML |
spring-boot-starter-activemq | 专为JMS(Java消息服务:是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。)使用Apache的ActiveMQ消息队列发送消息而生的启动器 |
spring-boot-starter-amqp | 用于Spring的AMQP(AMQP:即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议)和Rabbit MQ(RabbitMQ:这是一个开源消息代理软件。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。)的启动器 |
spring-boot-starter-aop | 用于Spring AOP 切面方向的编程和AspectJ的启动器 |
spring-boot-starter-artemis | 专为JMS使用Apache的Artemis而生的启动器 |
spring-boot-starter-batch | 用于Spring批处理任务的启动器 |
spring-boot-starter-cache | 用于Spring框架缓存支持的启动器 |
spring-boot-starter-data-cassandra | 用于Cassandra分布式数据库(Cassandra:是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter等知名[Web 2.0](https://baike.baidu.com/item/Web 2.0)网站所采纳,成为了一种流行的分布式结构化数据存储方案。)和String Data Cassandra的启动器 |
spring-boot-starter-data-cassandra-reactive | 用于Cassandra分布式数据库和String Data Cassandra Reactive的启动器 |
spring-boot-starter-data-couchbase | 专为使用Couchbase面向文档数据库(CouchBase:是一款开源的、分布式的、面向文档的NoSQL数据库,主要用于分布式缓存和数据存储领域。能够通过manage cache提供快速的亚毫米级别的k-v存储操作,并且提供快速的查询和其功能强大的能够指定SQL-like查询的查询引擎。)和Spring Data Couchbase而生的启动器 |
spring-boot-starter-data-couchbase-reactive | 用于Cassandra分布式数据库和String Data Cassandra Reactive的启动器 |
spring-boot-starter-data-elasticsearch | 用于Elasticsearch搜索(Elasticsearch:是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。Elasticsearch 是索引、搜索和分析魔法发生的地方。)、分析引擎和Spring Data Elasticsearch的启动器 |
spring-boot-starter-data-jdbc | 用于Spring Data JDBC(JDBC:全称Java Database Connectivity,也即Java数据库连接,简称JDBC。它是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。)的启动器 |
spring-boot-starter-data-jpa | 用于Spring Data JPA(JPA:JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。)与Hibernate(Hibernate:是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。)的启动器 |
spring-boot-starter-data-ldap | 用于Spring Data LDAP(LDAP:全称Lightweight Directory Access Protocol, 意为轻型目录访问协议,它是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。)的启动器 |
spring-boot-starter-data-mongodb | 用于MongoDB面向文档数据库(MongoDB:是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。)和Spring Data MongoDB的启动器 |
spring-boot-starter-data-mongodb-reactive | 用于MongoDB面向文档数据库和Spring Data MongoDB Reactive的启动器 |
spring-boot-starter-data-neo4j | 用于Neo4j图形数据库(Neo4j:是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。)和Spring Data Neo4j的启动器 |
spring-boot-starter-data-r2dbc | 用于Spring Data R2DBC的启动器 |
spring-boot-starter-data-redis | 用于Spring Data Redis存储Redis键值对与和 Lettuce client的启动器 |
spring-boot-starter-data-redis-reactive | 用于Spring Data Redis reactive存储Redis键值对和 Lettuce client的启动器 |
spring-boot-starter-data-rest | 专为Spring Data REST在Rest上公开Spring Data 仓库而生的启动器 |
spring-boot-starter-freemarker | 专为使用FreeMarker视图(FreeMarker:是一款模板引擎, 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。)搭建 MVC 网页应用而生的启动器 |
spring-boot-starter-graphql | 用于Spring GraphQL搭建GraphQL应用的启动器 |
spring-boot-starter-groovy-templates | 用于Groovy模板视图(Groovy:是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。)搭建MVC网页应用的启动器 |
spring-boot-starter-hateoas | 用于Spring MVC搭建基于超媒体和Restful风格的网页应用和Spring HATEOAS的启动器 |
spring-boot-starter-integration | 用于Spring Integration的启动器 |
spring-boot-starter-jdbc | 用于HikariCP连接池使用JDBC的启动器 |
spring-boot-starter-jersey | 用于JAX-RS和Jersey搭建Restful风格的网页应用的启动器。此外,也可以选用spring-boot-starter-web |
spring-boot-starter-jooq | 用于JDBC使用jOOQ访问SQL数据库的启动器。此外,也可以选用 spring-bootstarter-data-jpa 或者是spring-boot-starter-jdbc |
spring-boot-starter-json | 用于读写JSON(JSON:全称JavaScript Object Notation, JS对象简谱,这是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。)的启动器 |
spring-boot-starter-jta-atomikos | 专为JTA事务(JTA:即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。)使用Atomikos(Atomikos: 是一个为Java平台提供增值服务的并且开源类事务管理器。)而生的启动器 |
spring-boot-starter-mail | 用于Java和Spring框架的邮件发送支持的启动器 |
spring-boot-starter-mustache | 用于Mustache视图搭建网页应用的启动器 |
spring-boot-starter-oauth2-client | 用于Spring Security的OAuth2(OAuth2:是一种授权框架,提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。)或OpenID连接客户端特性使用的启动器 |
spring-boot-starter-oauth2-resource-server | 用于Spring Security的OAuth2资源服务器特性使用的启动器 |
spring-boot-starter-quartz | 用于Spring Quartz的启动器 |
spring-boot-starter-rsocket | 用于搭建RSocket客户端和服务器的启动器 |
spring-boot-starter-security | 用于Spring Security的启动器 |
spring-boot-starter-test | 用于使用包含JU您t Jupiter、Hamcrest和Mockito的依赖代码库测试Spring Boot应用的启动器 |
spring-boot-starter-thymeleaf | 用于Thymeleaf视图搭建MVC 网页应用的启动器 |
spring-boot-starter-validation | 用于使用Java Ben验证与Hibernate验证器的启动器 |
spring-boot-starter-web | 用于使用Spring MVC搭建包含Restful风格的网页应用的启动器。使用Tomcat作为默认嵌入式容器 |
spring-boot-starter-web-services | 用于Spring网页服务的启动器 |
spring-boot-starter-webflux | 用于使用Spring框架的Reactive网页支持搭建WebFlux应用的启动器 |
spring-boot-starter-websocket | 用于使用Spring框架的WebSocket支持搭建WebSocket应用的启动器 |
除了上面提到的应用启动器,下列启动器常常用于添加 生产就绪 特性:
表2.Spring Boot 生产启动器
Name | Description |
---|
spring-boot-starter-actuator | 用于使用Spring Boot的Actuator提供生产就绪特性帮助监督和管理您的应用的启动器 |
最后,Spring Boot 还包含了以下启动器,如果您想排除或者更换指定技术面的话会用到:
表3.Spring Boot技术启动器
Name | Description |
---|
spring-boot-starter-jetty | 用于使用Jetty作为内置的servlet容器的启动器,也可选用spring-boot-starter-tomcat 启动器 |
spring-boot-starter-log4j2 | 用于使用Log4j2的日志记录的启动器,也可选用spring-boot-starter-logging 启动器 |
spring-boot-starter-logging | 用于使用Logback记录日志的启动器,它也是Spring默认日志记录启动器 |
spring-boot-starter-reactor-netty | 用于使用Reactor Netty作为内置的reactive HTTP 服务器的启动器 |
spring-boot-starter-tomcat | 用于使用Tomcat作为内置的servlet容器的启动器,也是spring-boot-starter-web 中使用的默认servlet容器启动器 |
spring-boot-starter-undertow | 用于使用Undertow(Undertow:是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。)作为内置servlet容器的启动器,也可选用spring-boot-starter-tomcat 启动器 |
要了解如何交换技术面,请查看 swapping web server 和 logging system 文档
Tip
对于社区贡献的启动器列表,请查看在Github上的spring-boot-starters
模块中的 README 文件
6.2. Structuring Your Code
Spring Boot不需要使用任何指定的布局代码来工作,然而,也有些最佳实践是有所帮助的
6.2.1. Using the “default” Package
当一个类不包含package
关键字的声明,它被认为在“默认包”下。这种“默认包”的使用通常是不被鼓励且应该摒弃的。,在Spring Boot使用@ComponentScan
、@ConfigurationPropertiesScan
、@EntityScan
、或者是@SpringBootApplication
注解的时候, 它会引起奇怪的 BUG,因为每个 jar 包里的类都是可读的
Tip
建议您这边遵循Java的推荐包命名规范并且使用反向域名(例如:com.example.project
)
6.2.2. Locating the Main Application Class
我们通常推荐您在其他类上面的根路径包中查找您的主应用类。 @SpringBootApplication注解 常常用于放置在主类上,并且暗中为某些项目定义了一个基础的“搜索包”。例如,如果您编写一个JPA应用,@SpringBootApplication
注释的包将用于定位@Entity
注解项。此外,使用根路径包也允许组件扫描仅用于您的项目。
Tip
如果不想使用@SpringBootApplication
注解, 它导入的@EnableAutoConfiguration
和@ComponentScan
注解也定义了那些行为(这里的行为指的是组件扫描,自动配置等功能),因此换成这两个注解也是可行的
下列列表展示了一个典型的布局:
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
MyApplication.java
文件将会声明main方法,以及基本的@SpringBootApplication
注解,如下所示:
Java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
6.3. Configuration Classes
Spring Boot 钟爱基于Java的配置,虽然XML文件源也可以使用SpringApplication
,我们通常建议您的主要来源应当是一个独立的@Configuration
类。通常地,定义main
方法的类是一个好的@Configuration
的候选者
6.3.1. Importing Additional Configuration Classes
您不需要把所有的@Configuration
放在一个独立的类中,@Import
注解常常用于导入其他的配置类。此外,您还可以使用@ComponentScan
注解,它会自动装配所有包含@Configuration
注解的类将其作为Spring的组件
6.3.2. Importing XML Configuration
如果您必须要使用基于XML的配置,那么我们也建议您先从一个@Configuration
类开始,接着使用@ImportResource
注解加载XML配置文件
Tips
(虽然)网络上有许多使用XML配置的Spring Boot发布示例,(但是)如果可能的话,我们始终建议您使用基于Java的相同配置。比如查找Enable*
开头注解是一个好的开端
6.4、 Auto-configuration
Spring Boot自动配置基于添加的 jar 包依赖试图自动地构建Spring应用程序。例如:如果 HSQLDB
(Hyper SQL Database) 在类路径下,并且没有手动地配置任何数据库连接的 bean,那么 Spring Boot 自动配置一个内存中的数据库。
通过向其中一个@Configuration
配置类中添加@EnableAutoConfiguration
或者 @SpringBootApplication
注解来选择加入自动配置。
Tips
您应该只添加一个@SpringBootApplication
或者@EnableAutoConfiguration
注解,通常建议只将其中一个添加到您的@Configuration
配置类中
6.4.1. Gradually Replacing Auto-configuration
自动配置是非侵入式的,在任何时候,都可以自定义配置更换特定的自动配置。例如:如果您添加自定义的DataSource
的bean,那么默认内置的数据库就会失效.
如果需要了解当前应用的自动配置及其原因,打开应用程序--debug
开关,这样做可以启用核心日志器作日志调试并且会将情况输出到控制台。
6.4.2、Disabling Specific Auto-configuration Classes
如果发现应用程序中有不想使用的自动配置类,可以使用 @SpringBootAplication 注解的排除属性来禁用他们,如下所示:
Java
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class MyApplication
如果该类不在类路径下,还可以使用注解的excludeName
属性并且指定类的全限定名。如果您更喜欢使用@EnableAutoConfiguration
而不是@SpringBootApplication
注解,exclude
和excludeName
属性也能使用。顺便一提,使用spring.autoconfigure.exclude
属性,还能排除自动配置类的列表
Tips
排除(不需要的自动配置类)不仅可以在注解上而且还能使用属性
Note
虽然自动配置类是公共的,但是这些API的公共部分只能用于禁用自动配置类。这些类的实际内容,就类似于嵌套配置类或者bean方法,只供内部使用,所以我们并不推荐直接使用这些内容
6.6. Using the @SpringBootApplication Annotation
Chapter 13. Production-ready Features
Chapter 17. “How-to” Guides
本文回答了在使用Spring Boot时经常出现的例如“我该怎么做”这类的普通问题。它的覆盖范围可能并不详细,但是确实涵盖了很多内容。
如果你有一个的具体问题我们没有覆盖到,那么你也许想要检查stackoverflow.com,看看有没有人已经提供了回答。这也是一个询问问题的好地方(问的时候请带上spring-boot
标签)
如果您想要添加问题的回答到“How to”,我们也非常荣幸地欢迎您扩展这个章节,只要给我们发送一个拉取代码请求即可
17.1. Spring Boot Application
本节包含了与Spring Boot应用相关的话题
17.3. Embedded Web Servers
每个Spring Boot网页应用都包含了一个内置的网页服务器,但也就是这个特性“十分厉害”,产生了大量的“how-to”问题,包括类似于如何去改变内置服务器并且配置它这样的问题等等。如果你对此也有疑问的话,可以从本文开始,因为我们在这里回答了这些问题
17.3.1. Use Another Web Server
大部分的Spring Boot启动器都包含了默认的内置容器
- 对于servlet栈应用,
spring-boot-starter-web
通过spring-boot-starter-tomcat
包含了Tomcat网页应用服务器,但我们可以使用spring-boot-starter-jetty
或者 spring-boot-starter-undertow
替换掉 - 对于reactive栈应用,
spring-boot-starter-webflux
通过spring-boot-starter-reactor-netty
包含了Reactor Netty框架,但我们可以使用spring-boot-starter-tomcat
、spring-boot-starter-jetty
、或者spring-boot-starter-undertow
替换掉
17.7.2. Configure Log4j for Logging
17.16.9. Build an Executable Archive from Ant without Using spring-boot-antlib