使用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进行应用程序的运行监控等。

 

posted @ 2020-08-18 12:33  codedot  阅读(216)  评论(0编辑  收藏  举报