使用SpringBoot-1
一、构建系统
依赖管理
每一个SpringBoot版本都提供了一个它所支持的依赖项列表。实际上,你不需要为构建配置中的任何依赖项提供版本,因为SpringBoot为你管理这些依赖项。当你升级SpringBoot本身时,这些依赖项也会以一致的方式升级。
如果需要的话,你仍然可以指定一个版本并覆盖SpringBoot的建议。
每个SpringBoot版本都与Spring框架的一个基本版本相关联。强烈建议你不要指定其版本
Maven
要使用SpringBoot 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> <!-- ... --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.3.RELEASE</version> </plugin> </plugins> </build> </project>
如果你使用milestone或snapshot版本,还需要添加适当的pluginRepository元素,如果下表所示:
<pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories>
使用插件
Maven用户可以从spring-boot-starter-parent父项目继承以获得合理的默认值。父项目提供以下功能:
- Java 1.8作为默认编译器级别。
- UTF-8编码。
- 从 spring-boot-dependencies POM继承的依赖项管理部分,用于管理公共依赖项的版本。这个依赖项可以让你忽略<version> 标签。
继承父POM
<!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> </parent>
你应该只需要为此依赖项指定SpringBoot版本号。如果导入其他启动器,则可以安全地省略版本号。
不继承使用Parent POM
你可能有理由不从spring-boot-starter-parent父POM继承。你可能需要使用自己的公司标准父级,或者你可能更愿意显式声明所有的Maven配置。
如果你不想使用spring-boot-starter-parent父级,你仍然可以通过使用导入范围的依赖项来保留依赖项管理(而不是插件管理)的好处,如下所示:
<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
前面的示例设置不允许你使用属性覆盖各个依赖项,如上所述。要获得相同的结果,你需要在项目的dependencyManagement部分添加条目,然后再添加springboot dependency条目。例如,要使用不同版本的SLF4J库和Spring数据发布系列,可以将以下元素添加到pom.xml文件:
<dependencyManagement> <dependencies> <!-- Override SLF4J provided by Spring Boot --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <!-- Override Spring Data release train provided by Spring Boot --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-releasetrain</artifactId> <version>Moore-SR6</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
打包可执行文件
该插件可以创建包含应用程序所有依赖项的可执行文件(jar文件和war文件),然后可以使用java-jar运行。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.3.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
如果你使用的是spring-boot-starter-parent,那么这样的执行已经预先配置了一个重新打包的执行ID,以便只添加插件定义。
上面的例子重新打包了在Maven生命周期的包阶段构建的jar或war归档,包括在项目中定义的任何提供的依赖项。如果需要排除其中一些依赖项,可以使用排除选项
默认情况下,Devtools被自动排除(你可以使用excludeDevtools属性控制它)。为了使其与war打包一起工作,springboot devtools依赖项必须设置为可选的或具有所提供的范围。
这个插件重写你的清单,特别是它管理主类和启动类条目。如果默认值不起作用,你必须在springboot插件中配置值,而不是在jar插件中。清单中的主类由Spring Boot插件的layout属性控制,如下例所示:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.3.RELEASE</version> <configuration> <mainClass>${start.class}</mainClass> <layout>ZIP</layout> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
layout属性默认为归档类型(jar或war)确定的值。以下布局可用:
- JAR:常规的可执行JAR layout
- WAR:可执行的WAR layout。提供的依赖项放在WEB-INF/lib中,以避免在将war部署到servlet容器中时发生任何冲突。
- ZIP:类似于使用PropertiesLauncher的JAR布局。
- NONE:捆绑所有依赖项和项目资源。不绑定引导加载程序。
分层JAR
重新打包的jar分别在BOOT-INF/classes和BOOT-INF/lib中包含应用程序的类和依赖项。对于需要从jar的内容构建docker映像的情况,能够进一步分离这些目录以便将它们写入不同的层是很有用的。
分层jar使用与常规重新打包的jar相同的布局,但包含描述每个层的附加元数据文件。要使用此功能,必须启用分层功能:
<project> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.3.RELEASE</version> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build> </project>
默认情况下,将定义以下分层:
dependencies:对于其版本不包含快照的任何依赖项。
spring-boot-loader:jar loader classes
snapshot-dependencies:快照依赖项
application:classes and resources
自定义分层布局
根据应用程序的不同,你可能需要调整层的创建方式并添加新层。这可以使用单独的配置文件来完成,该文件应按如下所示进行注册:
<project> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.3.RELEASE</version> <configuration> <layers> <enabled>true</enabled> <configuration>${project.basedir}/src/layers.xml</configuration> </layers> </configuration> </plugin> </plugins> </build> </project>
配置文件描述了如何将jar分成层,以及这些层的顺序。以下示例显示如何显式定义上述默认顺序:
<layers xmlns="http://www.springframework.org/schema/boot/layers" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/boot/layers https://www.springframework.org/schema/boot/layers/layers-2.3.xsd"> <application> <into layer="spring-boot-loader"> <include>org/springframework/boot/loader/**</include> </into> <into layer="application" /> </application> <dependencies> <into layer="snapshot-dependencies"> <include>*:*:*SNAPSHOT</include> </into> <into layer="dependencies" /> </dependencies> <layerOrder> <layer>dependencies</layer> <layer>spring-boot-loader</layer> <layer>snapshot-dependencies</layer> <layer>application</layer> </layerOrder> </layers>
layers XML格式分为三个部分定义:
- <application>:应用程序类和资源应该如何分层。
- <dependencies>:依赖关系应该如何分层。
- <layerOrder>:层的写入顺序。
嵌套的<into>块在<application>和<dependencies>部分中用于声明层的内容。块按定义的顺序从上到下计算。任何未被较早块所声明的内容仍然可用于后续的块。
<into>块使用嵌套的<include>和<exclude>元素声明内容。<application>部分对include/exclude表达式使用Ant样式的补丁匹配。<dependencies>部分使用group:artifact[:version] 形式
如果未定义<include>,则考虑所有内容(不是由先前的块声明的)。
如果未定义<排除>,则不应用排除。
看看上面的<dependencies>示例,我们可以看到第一个<into>将声明快照依赖关系层的所有快照依赖项。随后的<into>将为依赖关系层声明任何剩余的内容(在本例中,不是快照的任何依赖项)。
<application>块有相似的规则。声明第一个org/springframework/boot/loader/**。然后为应用层声明所有剩余的类和资源。
定义<into>块的顺序通常与写入层的顺序不同。因此,必须始终包含<layerrorder>元素,并且必须覆盖<into>块引用的所有层。
启动器Starters
启动器是一组方便的依赖关系描述符,可以包含在应用程序中。你可以获得所需的所有Spring和相关技术的一站式服务,而不必搜索示例代码和复制粘贴大量依赖描述符。例如,如果你想开始使用Spring和JPA进行数据库访问,请在项目中包含spring-boot-starter-data-jpa依赖项。
启动器包含许多依赖项,你需要这些依赖项来快速启动和运行一个一致的、受支持的托管可传递依赖项集。
所有正式的启动器都遵循类似的命名模式;spring-boot-starter-*,其中*是一种特殊类型的应用程序。此命名结构用于在需要查找启动器时提供帮助。许多ide中的Maven集成允许你按名称搜索依赖项。例如,在安装了适当的Eclipse或STS插件后,你可以在POM编辑器中按ctrl空格键并键入“spring-boot-starter-*”以获得完整的列表。
第三方启动器不应该从spring-boot开始,因为它是为正式的spring-boot构件保留的。相反,第三方启动程序通常以项目名称开头。例如,名为thirdpartyproject的第三方starter项目通常被命名为thirdpartyproject-spring-boot-starter。
以下启动由group:org.springframework.boot提供:
- spring-boot-starter:核心启动器,核心启动程序,包括自动配置支持、日志记录和YAML。
- spring-boot-starter-activemq:使用Apache ActiveMQ的JMS
- spring-boot-starter-amqp:使用Spring AMQP 和 Rabbit MQ
- spring-boot-starter-aop:Spring AOP 和 AspectJ的切面编程
- spring-boot-starter-artemis:使用Apache Artemis的JMS
- spring-boot-starter-batch:使用Spring Batch
- spring-boot-starter-cache:使用Spring框架的缓存支持
- 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
- spring-boot-starter-data-couchbase-reactive:使用Couchbase面向文档数据库和 Spring Data Couchbase Reactive
- spring-boot-starter-data-elasticsearch:使用Elasticsearch和Spring Data Elasticsearch
- spring-boot-starter-data-jdbc:使用Spring Data JDBC
- spring-boot-starter-data-jpa:使用Spring Data JPA
- spring-boot-starter-data-ldap:使用Spring Data LDAP
- 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-r2dbc:使用Spring Data R2DBC
- spring-boot-starter-data-redis:利用Spring Data Redis和Lettuce使用Redis内存数据库
- spring-boot-starter-data-redis-reactive:利用Spring Data Redis Reactive和Lettuce使用Redis内存数据库
- spring-boot-starter-data-rest:Spring Data REST暴露Spring Data repositories
- spring-boot-starter-data-solr:利用Spring Data Solr使用Apache Solr
- spring-boot-starter-freemarker:使用FreeMarker 构建MVC应用
- spring-boot-starter-groovy-templates:使用 Groovy Templates构建MVC应用
- spring-boot-starter-hateoas:使用Spring MVC 和 Spring HATEOAS构建基于超媒体的RESTful web应用程序
- spring-boot-starter-integration:使用 Spring Integration
- spring-boot-starter-jdbc:JDBC与HikariCP连接池一起使用
- spring-boot-starter-jersey:使用JAX-RS和Jersey构建RESTful web应用程序,spring-boot-starter-web的替代方案
- spring-boot-starter-jooq:使用jOOQ访问SQL数据库,spring-boot-starter-data-jpa 和 spring-boot-starter-jdbc的替代品
- spring-boot-starter-json:读写JSON
- spring-boot-starter-jta-atomikos:使用Atomics启动JTA事务
- spring-boot-starter-jta-bitronix:使用Bitronix启动JTA事务。自2.3.0起已弃用
- spring-boot-starter-mail:Java Mail和Spring框架的电子邮件发送支持
- spring-boot-starter-mustache:使用Mustache 构建Web 应用
- spring-boot-starter-oauth2-client:使用Spring Security的OAuth2/OpenID连接客户端
- spring-boot-starter-oauth2-resource-server:使用Spring Security的OAuth2资源服务器
- spring-boot-starter-quartz:使用Quartz任务调度
- spring-boot-starter-rsocket:构建RSocket客户端和服务端
- 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验证器中使用javabean验证
- spring-boot-starter-web:使用Spring Mvc构建web,包括RESTful应用程序。使用Tomcat作为默认的嵌入式容器
- spring-boot-starter-web-services:使用Spring Web Services
- spring-boot-starter-webflux:使用Spring框架的Reactive Web 构建WebFlux应用程序
- spring-boot-starter-websocket:使用Spring框架的WebSocket 构建WebSocket 应用
以下启动器可以用于生产:
- spring-boot-starter-actuator:使用springboot的执行器,它提供了可用于生产的特性来帮助你监视和管理应用程
最后,springboot还包括以下启动器,如果你想排除或交换特定的技术方面,可以使用这些启动器:
- 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-boot-starter-reactor-netty:使用Reactor Netty作为嵌入式的HTTP服务器的启动器。
- spring-boot-starter-tomcat:使用Tomcat作为嵌入式servlet容器。使用的默认servlet容器starter
- spring-boot-starter-undertow:使用Undertow作为嵌入式servlet容器,spring-boot-starter-tomcat的替代品
二、构建代码结构
springboot不需要任何特定的代码布局来工作。但是,有一些最佳实践可以帮助你。
使用“default”包
当一个类不包含包声明时,它被认为在“default package”中。通常不鼓励使用“default package”,应避免使用。对于使用@ComponentScan、@ConfigurationPropertiesScan、@EntityScan或@SpringBootApplication注释的springboot应用程序来说,这可能会导致特定的问题,因为每个jar中的每个类都会被读取。
我们建议你遵循Java推荐的包命名约定,并使用反向域名(例如,com.example.project).
定位主应用程序类
我们通常建议你将主应用程序类放在根包中的其他类之上。@SpringBootApplication注释通常放在主类上,它隐式地为某些项定义了一个基本的“搜索包”。例如,如果你正在编写一个JPA应用程序,@SpringBootApplication注释类的包用于搜索@Entity项。使用根包还允许组件扫描仅应用于你的项目。
如果你不想使用@SpringBootApplication,那么它导入的@EnableAutoConfiguration和@ComponentScan注释定义了这种行为,因此你也可以使用它们。
下面的列表显示了一个典型布局:
com +- example +- myapplication +- Application.java | +- customer | +- Customer.java | +- CustomerController.java | +- CustomerService.java | +- CustomerRepository.java | +- order +- Order.java +- OrderController.java +- OrderService.java +- OrderRepository.java
Application.java 声明main方法和基本@SpringBootApplication,如下所示:
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); } }
三、 Configuration 类
SpringBoot支持基于Java的配置。尽管可以将SpringApplication与XML一起使用,但我们通常建议你的主要源代码是单个@Configuration类。通常,定义main方法的类是一个直接@Configuration的一个很好的候选类。
网上已经发布了许多使用XML配置的Spring配置示例。如果可能,请始终尝试使用等效的基于Java的配置,查找Enable*注解是一个很好的起点。
导入其他配置类
你不需要将所有的@Configuration放入一个类中。@Import注释可用于导入其他配置类。或者,可以使用@ComponentScan自动获取所有Spring组件,包括@Configuration类。
导入XML配置
如果你绝对必须使用基于XML的配置,我们建议你还是从@configuration类开始。然后可以使用@ImportResource注释来加载XML配置文件。
四、自动配置
springboot的自动配置会尝试根据你添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB在类路径上,并且你没有手动配置任何数据库连接bean,那么springboot会自动配置内存中的数据库。
你需要通过在@configuration类中添加@EnableAutoConfiguration或@SpringBootApplication注释来选择自动配置。
你应该只添加一个@SpringBootApplication或@EnableAutoConfiguration注释。我们通常建议你只将其中一个添加到主@Configuration类中。
逐渐取代自动配置
自动配置是非侵害的。在任何时候,你都可以开始定义自己的配置来替换自动配置的特定部分。例如,如果你添加自己的DataSource bean,默认的嵌入式数据库支持就会退出。
如果你需要找出当前正在应用的自动配置以及原因,请使用--debug开关启动应用程序。这样做将启用所选核心记录器的调试日志,并将条件报告记录到控制台。
禁用特定的自动配置类
如果发现不需要的特定自动配置类正在被应用,可以使用@SpringBootApplication的exclude属性禁用它们,如下例所示:
import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; @SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) public class MyApplication { }
如果类不在类路径上,则可以使用注释的excludeName属性并指定完全限定名。如果你喜欢使用@EnableAutoConfiguration而不是@SpringBootApplication,那么还可以使用excludeName。最后,还可以使用spring.autoconfigure.exclude属性。
即使自动配置类是公共的,该类唯一被认为是公共API的方面是可以用于禁用自动配置的类的名称。这些类的实际内容(如嵌套的配置类或bean方法)仅供内部使用,我们不建议直接使用。
五、Spring Beans和依赖注入
你可以自由使用任何标准Spring框架技术来定义bean及其注入的依赖项。我们经常发现,使用@ComponentScan(查找bean)和使用@Autowired(执行构造函数注入)效果很好。
如果按照上面的建议构造代码(将应用程序类定位在根包中),则可以添加不带任何参数的@ComponentScan。所有应用程序组件(@Component、@Service、@Repository、@Controller等)都自动注册为Spring Bean。
下面的示例显示了一个@Service Bean,它使用构造函数注入来获得所需的RiskAssessor 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; } // ... }
如果一个bean有一个构造函数,可以省略@Autowired,如下例所示:
@Service public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; public DatabaseAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }
请注意,使用构造函数注入如何使riskAssessor字段标记为final,这表明它不能随后更改。
六、使用@SpringBootApplication注解
许多springboot开发人员喜欢他们的应用程序使用自动配置、组件扫描,并且能够在他们的“应用程序类”上定义额外的配置。一个@SpringBootApplication注释可用于启用这三个功能,即:
- @EnableAutoConfiguration:启用springboot的自动配置机制
- @ComponentScan:在应用程序所在的包上启用@Component scan
- @Configuration:允许在上下文中注册额外的bean或导入额外的配置类
package com.example.myapplication; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
@SpringBootApplication还提供别名来定制@EnableAutoConfiguration和@ComponentScan的属性。
这些功能都不是必需的,你可以选择用它启用的任何功能来替换这个单一的注释。例如,你可能不希望在应用程序中使用组件扫描或配置属性扫描:
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(proxyBeanMethods = false) @EnableAutoConfiguration @Import({ MyConfig.class, MyAnotherConfig.class }) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }在这个例子中,Application和任何其他springboot应用程序一样,除了@Component注释的类和@ConfigurationProperties注释的类都不会被自动检测,并且用户定义的bean是显式导入的(@Import)
七、运行你的Application
IDE上运行
作为打包应用程序运行
如果使用Spring Boot Maven或Gradle插件创建可执行jar,则可以使用java-jar运行应用程序,如下例所示:
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
还可以在启用远程调试支持的情况下运行打包应用程序。这样可以将调试器附加到打包的应用程序,如下例所示:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myapplication-0.0.1-SNAPSHOT.jar
使用Maven Plugin
springboot maven插件包含一个运行目标,可以用来快速编译和运行应用程序。应用程序以分解的形式运行,就像在IDE中一样。以下示例显示了运行Spring Boot应用程序的典型Maven命令:
$ mvn spring-boot:run
你可能还需要使用MAVEN_OPTS操作系统环境变量,如下例所示:
$ export MAVEN_OPTS=-Xmx1024m
热部署
由于springboot应用程序是普通的Java应用程序,JVM热交换应该是开箱即用的。JVM热交换在某种程度上受限于它可以替换的字节码。对于更完整的解决方案,可以使用JRebel。
spring-boot-devtools模块还支持快速应用程序重启。
八、开发者工具
springboot包括一组附加的工具,可以使应用程序开发体验更愉快一些。spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发时特性。要包含devtools支持,请将模块依赖项添加到您的构建中,
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
运行完全打包的应用程序时,开发人员工具将自动禁用。如果您的应用程序是从java-jar启动的,或者是从一个特殊的类加载器启动的,那么它就被认为是一个“生产应用程序”。如果这不适用于您(即,如果您从容器运行应用程序),请考虑排除devtools或设置-Dspring.devtools.restart.enabled=false的系统属性。
在Maven中将依赖项标记为可选,可以防止devtools被传递地应用到使用您的项目的其他模块。
默认情况下,重新打包的存档不包含devtools。如果您想使用某个远程devtools特性,则需要包含它。使用Maven插件时,将excludeDevtools属性设置为false。
属性默认值
springboot支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。另外,springmvc可以在提供静态资源时向响应添加HTTP缓存头。
虽然缓存在生产中非常有益,但在开发过程中它可能会适得其反,使您无法看到刚刚在应用程序中所做的更改。因此,spring-boot-devtools默认情况下禁用缓存选项。
缓存选项通常由application.properties文件。例如,Thymeleaf提供spring.thymeleaf.cache属性。spring-boot-devtools模块不需要手动设置这些属性,而是自动应用合理的开发时配置。
因为在开发springmvc和springwebflux应用程序时需要更多关于web请求的信息,开发人员工具将为web日志记录组启用调试日志记录。这将为您提供有关传入请求、哪个处理程序正在处理它、响应结果等的信息。如果您希望记录所有请求详细信息(包括潜在的敏感信息),可以打开 spring.mvc.log-request-details或spring.codec.log-request-details配置属性。
如果不希望应用属性默认值,可以在application.properties设置spring.devtools.add为false。
有关devtools应用的属性的完整列表,请参阅DevToolsPropertyDefaultsPostProcessor。
自动重启
当类路径上的文件发生变化时,使用springboot devtools的应用程序会自动重新启动。在IDE中工作时,这可能是一个有用的特性,因为它为代码更改提供了一个非常快速的反馈循环。默认情况下,类路径上指向某个目录的任何条目都会被监视以进行更改。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。
DevTools依赖于应用程序上下文的关闭钩子在重新启动期间关闭它。如果您禁用了关闭挂钩,它将无法正常工作(SpringApplication.setRegisterShutdownHook(错误))。
当决定类路径上的某个条目在更改时是否应该触发重新启动时,DevTools会自动忽略名为spring-boot、spring-boot-devtools、spring-boot-autoconfigure、spring-boot-actuator和spring-boot-starter的项目。
DevTools需要定制ApplicationContext使用的ResourceLoader。如果您的应用程序已经提供了一个,它将被包装。不支持直接重写ApplicationContext上的getResource方法。
打包应用程序上生产
可执行jar可用于生产部署。由于它们是自包含的,因此也非常适合基于云的部署。
可以考虑使用spring-boot-actuator进行应用程序的运行监控等。