Spring Boot文档(004)-第三部分

第三部分:使用Spring Boot

本节将详细介绍如何使用Spring Boot。包括如:构建系统,自动配置以及如何运行程序等。我们还介绍了一些最佳实践。虽然Spring Boot没有什么特别的特殊之处(它只是你可以使用的另一个库),但有一些建议,如果遵循这些建议,会使开发过程变得更容易一些。

如果您刚刚开始使用Spring Boot,那么在深入本节之前,您应该阅读 入门指南

13.建立系统

强烈建议选择支持依赖关系管理来构建系统 ,并且可以使用发布到“Maven Central”存储库的构件。我们建议您选择Maven或Gradle。Spring Boot可以与其他构建系统(例如Ant)一起工作,但对它们的支持不是太好。

13.1依赖管理

Spring Boot的每个版本都提供了它支持的一系列依赖关系。使用中,不需要为构建配置中的任何这些依赖项提供版本,因为Spring Boot正在为您进行管理。当升级Spring Boot本身时,这些依赖关系也将以一致的方式升级。

说明:也可以指定版本来覆盖Spring Boot自动选择的依赖版本。

这些依赖的列表包含SpringBoot所使用的所有Spring模块和其他第三方的库,该列表以标准列表(spring-boot-dependencies) 提供。并且还提供Maven和 Gradle的其他专用支持。

说明:Spring Boot的每个版本都与Spring Framework的基础版本相关联,因此我们强烈建议不要自行指定其版本。

13.2 Maven

Maven用户可以从spring-boot-starter-parent项目中继承以获得合理的默认值。父项目提供以下功能:

1.默认编译等级为java1.6

2.源码编码为utf-8

3.依赖管理部分,让您省去<version>标签,继承使用spring-boot-dependencies的

4.智能的资源过滤

5.智能的插件配置 (exec pluginsurefireGit commit IDshade)。

6.智能过滤application.propertiesapplication.yml和其他特定的配置文件(例如application-foo.propertiesapplication-foo.yml)。

最后一点:由于默认配置文件接受Spring样式占位符(${…​}),Maven过滤被更改为使用@..@占位符(您可以使用Maven属性覆盖该占位符resource.delimiter)。


13.2.1继承starter parent

要将项目配置为从spring-boot-starter-parent简单设置继承parent

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.14.RELEASE</version>
</parent>

说明:只需要在此依赖项上指定Spring Boot版本号。如果导入其他的启动器,则可以安全地省略版本号。

通过该设置,还可以通过覆盖自己项目中的属性来覆盖各个依赖项。例如,要升级到另一个Spring Data发行版,您需要将以下内容添加到您的pom.xml

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

提醒:检查spring-boot-dependenciespom 以获取支持的属性列表。

13.2.2使用没有parent POM的Spring Boot

不是每个人都喜欢从spring-boot-starter-parentPOM 继承。您可能需要使用您自己的公司标准parent项,或者您可能更愿意明确声明所有Maven配置。

如果你不想使用它spring-boot-starter-parent,你仍然可以通过使用scope=import 依赖来保持依赖管理的好处(但不是插件管理):

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.14.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

如上所述,该设置不允许您使用属性覆盖单个依赖项。为了达到相同的效果,您需要在在dependencyManagement项目中添加内容。例如,要升级到另一个Spring Data发行版,您需要将以下内容添加到您的。spring-boot-dependenciespom.xml

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.14.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

说明:在上面的例子中,我们指定了一个BOM,但是任何依赖类型都可以被覆盖。

13.2.3更改Java版本

spring-boot-starter-parent选相当保守的Java兼容性。如果您想遵循我们的建议并使用更高版本的Java版本,则可以添加一个 java.version属性:

<properties>
    <java.version>1.8</java.version>
</properties>

13.2.4使用Spring Boot Maven插件

Spring Boot包含一个Maven插件 ,可以将项目打包为可执行的jar。<plugins> 如果你想使用它,请将插件添加到你的部分:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

说明:如果你使用Spring Boot的起parent pom,你只需要添加插件,除非你想改变在父项中定义的设置,否则不需要配置它。


13.3 Gradle

Gradle用户可以在他们的dependencies部分直接导入'starters' 。与Maven不同,没有“super parent”可以导入以共享某些配置。

repositories {
    jcenter()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.5.14.RELEASE")
}

spring-boot-gradle-plugin也可提供任务创建可执行的jars和从源码运行项目。它还提供 依赖性管理,除其他功能外,还允许您省略由Spring Boot管理的任何依赖项的版本号:

plugins {
    id 'org.springframework.boot' version '1.5.14.RELEASE'
    id 'java'
}


repositories {
    jcenter()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

13.4 Ant

可以使用Apache Ant + Ivy构建Spring Boot项目。该 spring-boot-antlib“的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="1.5.14.RELEASE" />

    <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>

提醒:如果不想使用该模块请参见第85.10节“从Ant构建可执行档案,而不使用spring-boot-antlib” “操作方法” spring-boot-antlib

13.5 Starters

starters可以很方便的导入到应用中。您可以获得所需的所有Spring及相关技术的一站式服务,而无需搜索示例代码并复制粘贴依赖关系项。例如,如果您想开始使用Spring和JPA进行数据库访问,只需将spring-boot-starter-data-jpa依赖项包含在您的项目中,是不是很爽。

starers包含大量的依赖项,这些依赖项需要使项目快速运行并具有一致的、受支持的托管传递依赖集。

命名原则

所有正式的启动程序都遵循类似的命名模式;spring-boot-starter-*,其中*是一种特殊类型的应用程序。这种命名结构旨在帮助您找到一个启动器。许多ide中的Maven集成允许您按名称搜索依赖项。例如,安装了适当的Eclipse或STS插件后,您可以在POM编辑器中单击ctrl-space,并为完整的列表输入“spring-boot-starter”。
正如在“创建自己的启动器”一节中所解释的,第三方启动程序不应该从Springboot开始,因为它是为官方的Spring启动构件预留的。acme的第三方启动程序通常被命名为acme-spring-boot-starter。

以下应用程序启动程序由Spring Boot在 org.springframework.boot组中提供:

表13.1:Spring Boot application starters

NameDescriptionPom

spring-boot-starter

Core starter, including auto-configuration support, logging and YAML

Pom

spring-boot-starter-activemq

Starter for JMS messaging using Apache ActiveMQ

Pom

spring-boot-starter-amqp

Starter for using Spring AMQP and Rabbit MQ

Pom

spring-boot-starter-aop

Starter for aspect-oriented programming with Spring AOP and AspectJ

Pom

spring-boot-starter-artemis

Starter for JMS messaging using Apache Artemis

Pom

spring-boot-starter-batch

Starter for using Spring Batch

Pom

spring-boot-starter-cache

Starter for using Spring Framework’s caching support

Pom

spring-boot-starter-cloud-connectors

Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku

Pom

spring-boot-starter-data-cassandra

Starter for using Cassandra distributed database and Spring Data Cassandra

Pom

spring-boot-starter-data-couchbase

Starter for using Couchbase document-oriented database and Spring Data Couchbase

Pom

spring-boot-starter-data-elasticsearch

Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch

Pom

spring-boot-starter-data-gemfire

Starter for using GemFire distributed data store and Spring Data GemFire

Pom

spring-boot-starter-data-jpa

Starter for using Spring Data JPA with Hibernate

Pom

spring-boot-starter-data-ldap

Starter for using Spring Data LDAP

Pom

spring-boot-starter-data-mongodb

Starter for using MongoDB document-oriented database and Spring Data MongoDB

Pom

spring-boot-starter-data-neo4j

Starter for using Neo4j graph database and Spring Data Neo4j

Pom

spring-boot-starter-data-redis

Starter for using Redis key-value data store with Spring Data Redis and the Jedis client

Pom

spring-boot-starter-data-rest

Starter for exposing Spring Data repositories over REST using Spring Data REST

Pom

spring-boot-starter-data-solr

Starter for using the Apache Solr search platform with Spring Data Solr

Pom

spring-boot-starter-freemarker

Starter for building MVC web applications using FreeMarker views

Pom

spring-boot-starter-groovy-templates

Starter for building MVC web applications using Groovy Templates views

Pom

spring-boot-starter-hateoas

Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS

Pom

spring-boot-starter-integration

Starter for using Spring Integration

Pom

spring-boot-starter-jdbc

Starter for using JDBC with the Tomcat JDBC connection pool

Pom

spring-boot-starter-jersey

Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web

Pom

spring-boot-starter-jooq

Starter for using jOOQ to access SQL databases. An alternative to spring-boot-starter-data-jpa or spring-boot-starter-jdbc

Pom

spring-boot-starter-jta-atomikos

Starter for JTA transactions using Atomikos

Pom

spring-boot-starter-jta-bitronix

Starter for JTA transactions using Bitronix

Pom

spring-boot-starter-jta-narayana

Spring Boot Narayana JTA Starter

Pom

spring-boot-starter-mail

Starter for using Java Mail and Spring Framework’s email sending support

Pom

spring-boot-starter-mobile

Starter for building web applications using Spring Mobile

Pom

spring-boot-starter-mustache

Starter for building MVC web applications using Mustache views

Pom

spring-boot-starter-security

Starter for using Spring Security

Pom

spring-boot-starter-social-facebook

Starter for using Spring Social Facebook

Pom

spring-boot-starter-social-linkedin

Stater for using Spring Social LinkedIn

Pom

spring-boot-starter-social-twitter

Starter for using Spring Social Twitter

Pom

spring-boot-starter-test

Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito

Pom

spring-boot-starter-thymeleaf

Starter for building MVC web applications using Thymeleaf views

Pom

spring-boot-starter-validation

Starter for using Java Bean Validation with Hibernate Validator

Pom

spring-boot-starter-web

Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container

Pom

spring-boot-starter-web-services

Starter for using Spring Web Services

Pom

spring-boot-starter-websocket

Starter for building WebSocket applications using Spring Framework’s WebSocket support

Pom

 

除application starters外,还可以使用以下starters来添加 生产准备功能:

表 13.2. Spring Boot production starters

NameDescriptionPom

spring-boot-starter-actuator

Starter for using Spring Boot’s Actuator which provides production ready features to help you monitor and manage your application

Pom

spring-boot-starter-remote-shell

Starter for using the CRaSH remote shell to monitor and manage your application over SSH. Deprecated since 1.5

Pom

 

最后,Spring Bug还包括一些starters,如果你想排除或交换特定的技术面,可以使用它。

表13.3. Spring Boot technical starters

NameDescriptionPom

spring-boot-starter-jetty

Starter for using Jetty as the embedded servlet container. An alternative to spring-boot-starter-tomcat

Pom

spring-boot-starter-log4j2

Starter for using Log4j2 for logging. An alternative to spring-boot-starter-logging

Pom

spring-boot-starter-logging

Starter for logging using Logback. Default logging starter

Pom

spring-boot-starter-tomcat

Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by spring-boot-starter-web

Pom

spring-boot-starter-undertow

Starter for using Undertow as the embedded servlet container. An alternative to spring-boot-starter-tomcat

Pom

说明:有关其他社区的列表贡献首先,看 README文件中 spring-boot-startersGitHub上的模块。

14.代码结构

Spring Boot不需要任何特定的代码布局,但是,有一些最佳实践可以提供帮助。

14.1使用“default”包

当一个类不定义package声明时,它被认为是在“default package”中,这种操作不建议,而且应该尽量的避免。对于spring boot程序在使用@ComponentScan, @EntityScan or @SpringBootApplication这些注解上可能会产生一些特殊的问题,因为每个jar中的每个class文件都会被读取。

说明:我们建议您遵循Java推荐的软件包命名约定并使用反向域名(例如com.example.project)。

14.2查找main application class

我们通常建议您将主应用程序类置于其他类之上的根包中。@SpringBootApplication注释通常放在主类上,它隐式地为某些项定义了基本的“search package”。例如,如果您正在编写一个JPA应用程序,那么将使用@ springbootapplication带注释的类的包来搜索@Entity项。使用根包还允许组件扫描只应用于项目。

说明:如果你不想使用@SpringBootApplication时,可以用@EnableAutoConfiguration 和@ComponentScan来代替。

一个典型的布局:

com
 +- example
     +- myproject
         +- Application.java
         |
         +- domain
         |   +- Customer.java
         |   +- CustomerRepository.java
         |
         +- service
         |   +- CustomerService.java
         |
         +- web
             +- CustomerController.java

Application.java文件将声明主方法,以及基本的@SpringBootApplication。

package com.example.myproject;

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);
    }

}

15. Configuration类

Spring Boot支持基于java的配置。虽然可以使用XML配置来调用SpringApplication.run(),但是我们通常建议您的主源是一个@Configuration类。通常,定义main方法的类也是一个很好的候选者,作为主要的@Configuration。

提醒:使用XML配置在Internet上已经发布了许多Spring配置示例。如果可能的话,始终尝试使用等效的基于java的配置。搜索Enable*注解可能是一个很好的开始。


15.1导入其他配置类

不需要将所有的@Configuration放在一个类中。可以使用@Import注释来导入其他配置类。或者,您可以使用@ComponentScan自动获取所有Spring组件,包括@Configuration类。

15.2导入XML配置

如果您一定要使用基于XML的配置,我们建议您还是从一个@Configuration类开始。然后可以使用一个附加的@ImportResource注释来加载XML配置文件。


16.自动配置

Spring Boot自动配置尝试根据添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB在您的类路径上,并且您没有手动配置任何数据库连接bean,那么我们将自动配置内存中的数据库。
通过将@EnableAutoConfiguration或@SpringBootApplication注释添加到您的@Configuration类中,您需要选择加入到自动配置。
【提示】
您应该只添加一个@SpringBootApplication或@EnableAutoConfiguration注释。我们通常建议您只将一个或另一个添加到主@Configuration类中。

16.1逐渐取代自动配置

自动配置是无创的,在任何时候,您都可以开始定义您自己的配置来替换自动配置的特定部分。例如,如果您添加了自己的数据源bean,默认的嵌入式数据库支持将会后退。
如果您需要了解当前应用的是什么自动配置,以及原因,请使用—debug开关启动应用程序。这将为核心日志记录器的选择启用调试日志,并将自动配置报告记录到控制台。

16.2禁用特定的自动配置

如果您发现正在应用您不希望的特定的自动配置类,您可以使用@EnableAutoConfiguration的排除属性来禁用它们。

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

如果类不在类路径上,则可以使用注释的exclusive dename属性并指定完全限定的名称。最后,还可以通过spring.autoconfigure控制自动配置类的列表。排除属性。
【提示】
您可以在注释级别和使用属性两方面定义排除。

17. 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,这表明不能随后更改该字段。

18.使用@SpringBootApplication

许多Springboot开发人员喜欢他们的应用程序使用自动配置、组件扫描,并能够在他们的“应用程序类”上定义额外的配置。可以使用一个@SpringBootApplication注释来启用这三个特性,即:
@EnableAutoConfiguration:启用Spring Boot的自动配置机制
@ComponentScan:在应用程序所在的包上启用@Component扫描(请参阅最佳实践
@Configuration:允许在上下文中注册额外的bean或导入额外的配置类
@SpringBootApplication注释相当于使用@Configuration、@EnableAutoConfiguration和@ComponentScan的默认属性:

package com.example.myproject;

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.myproject;

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);
    }

}

在本例中,应用程序与任何其他Spring引导应用程序一样,只是不会自动检测到@ component - anno类,并且显式地导入用户定义的bean(参见@Import)。

 

19.运行你的应用程序

将应用程序打包为jar并使用嵌入式HTTP服务器的最大好处之一是,可以像运行其他应用程序一样运行应用程序。调试Spring引导应用程序也很简单;您不需要任何特殊的IDE插件或扩展。
[注]
本节只讨论基于jar的打包,如果您选择将应用程序打包为war文件,您应该参考服务器和IDE文档。

19.1从IDE运行

您可以从IDE作为一个简单的Java应用程序运行Spring引导应用程序,但是,首先需要导入项目。导入步骤将根据您的IDE和构建系统而变化。大多数ide可以直接导入Maven项目,例如Eclipse用户可以选择导入…→现有Maven项目从文件菜单。
如果不能直接将项目导入IDE,那么可以使用构建插件生成IDE元数据。Maven包含用于Eclipse和 IDEA的插件 ; Gradle为各种IDE提供插件。
【提示】
如果您不小心运行了两次web应用程序,您将看到一个“已在使用中的端口”错误。STS用户可以使用Relaunch按钮,而不是运行以确保关闭任何现有实例。

19.2作为打包应用程序运行

如果您使用Spring Boot Maven或Gradle插件来创建可执行jar,您可以使用java -jar来运行应用程序。例如:

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

还可以运行支持远程调试的打包应用程序。这允许您将调试器附加到您的打包应用程序:

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myproject-0.0.1-SNAPSHOT.jar

19.3使用Maven插件

Spring Boot Maven插件包含一个运行目标,可用于快速编译和运行应用程序。应用程序以爆炸的形式运行,就像在IDE中一样。

$ mvn spring-boot:run

您可能还希望使用有用的操作系统环境变量:

$ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M


19.4使用Gradle插件

Spring Boot Gradle插件还包含一个bootRun任务,该任务可用于以爆炸形式运行应用程序。当您导入spring-boot-gradle-plugin时,将添加bootRun任务:

$ gradle bootRun

您可能还想使用这个有用的操作系统环境变量:

$ export JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=128M

19.5热插拔

由于Spring引导应用程序只是普通的Java应用程序,因此JVM热交换应该是开箱即用的。JVM热交换在一定程度上限制了它可以替换的字节码,因为可以使用更完整的解决方案 JRebel或 Spring Loaded加载的项目。spring-boot-devtools模块还包括对快速应用程序重启的支持。
请参阅下面第第20章,开发人员工具部分和 热插拔“操作方法”

20.开发人员工具

Spring Boot包含了一组额外的工具,可以使应用程序开发体验更愉快一些。spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发时特性。要包含devtools支持,只需将模块依赖添加到构建:

Maven. 

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

 

Gradle. 

dependencies {
    compileOnly("org.springframework.boot:spring-boot-devtools")
}

[注]
在运行完全打包的应用程序时,会自动禁用开发人员工具。如果您的应用程序是使用java -jar启动的,或者是使用特殊的类加载程序启动的,那么它就被认为是“生产应用程序”。在Maven中将依赖项标记为可选的,或者在Gradle中只使用compileOnly,这是防止使用项目将devtools临时应用到其他模块的最佳实践

重新打包的归档在默认情况下不包含devtools。如果您想要使用某些远程devtools功能,您将需要禁用排除工具构建属性来包含它。Maven和Gradle插件都支持这个属性。

20.1属性默认值

Spring引导所支持的几个库都使用缓存来提高性能。例如,模板引擎将缓存已编译的模板,以避免重复解析模板文件。此外,Spring MVC可以在服务静态资源时向响应添加HTTP缓存头。
虽然缓存在生产中非常有用,但是在开发过程中它会产生反作用,防止您看到您在应用程序中所做的更改。出于这个原因,spring-boot-devtools将在默认情况下禁用这些缓存选项。
缓存选项通常由应用程序中的设置配置。属性文件。例如,Thymeleaf提供了春天。缓存属性。spring-boot-devtools模块不需要手动设置这些属性,而是自动应用合理的开发时配置。
【提示】
有关应用的属性的完整列表,请参见DevToolsPropertyDefaultsPostProcessor

20.2自动重启

使用spring-boot-devtools的应用程序将在类路径更改时自动重新启动。在IDE中工作时,这可能是一个有用的特性,因为它为代码更改提供了一个非常快速的反馈循环。默认情况下,指向文件夹的类路径中的任何条目都将受到监视,以查看是否有更改。注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序
引发了重启
由于DevTools监控类路径资源,触发重新启动的惟一方法是更新类路径。您导致要更新的类路径的方式取决于您使用的IDE。在Eclipse中,保存修改后的文件将导致类路径更新并触发重新启动。在IntelliJ IDEA中,构建项目(Build -> Build project)也会产生同样的效果。

【提示】

您还可以通过受支持的构建插件(即Maven和Gradle)启动应用程序,只要启用了fork,因为DevTools需要一个独立的应用程序类加载程序才能正常运行。Gradle和Maven在类路径上检测DevTools时是默认的。
【提示】
自动重新启动在使用肝脏载荷时非常有效。 详情请参阅下文。如果您使用JRebel,自动重启将被禁用,以支持动态类重载。其他devtools特性(如LiveReload和property overrides)仍然可以使用。
[注]
DevTools依赖于应用程序上下文的关机挂钩在重新启动时关闭它。如果您禁用了关闭钩子(SpringApplication.setRegisterShutdownHook(false)),那么它将无法正常工作。
[注]
当决定类路径上的条目是否应该在更改时触发重新启动时,DevTools会自动忽略名为spring-boot、spring-boot-dev工具、spring-boot-autoconfigure、spring-boot-actuator和spring-boot-starter的项目。
[注]
DevTools需要定制ApplicationContext使用的ResourceLoader:如果您的应用程序已经提供了一个,那么它将被打包。不支持在ApplicationContext上直接覆盖getResource方法。

重启vs重载
Spring Boot提供的重新启动技术使用两个类装入器。不更改的类(例如来自第三方jar的类)被加载到基类加载器中。正在积极开发的类被加载到restart classloader中。当重新启动应用程序时,会丢弃restart classloader,并创建一个新的。这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为基类加载器已经可用并填充了。
如果您发现重新启动对应用程序来说不够快,或者遇到了类加载问题,您可以考虑重新加载技术,如JRebel。这些工作通过重写类,使它们更适合重载。 Spring Loaded提供了另一个选项,但是它不支持很多框架,也不支持商业支持。

20.2.1排除资源

当某些资源发生更改时,不一定需要触发重新启动。例如,可以就地编辑Thymeleaf模板。默认情况下,在/META-INF/maven、/META-INF/resources、/resources、/static、/public或/template中更改资源不会触发重新启动,但会触发 实时重新加载。如果您想自定义这些排除,可以使用spring.devtools.restart.exclude属性。例如,仅排除/静态和/公开,您将设置如下:

spring.devtools.restart.exclude=static/**,public/**

【提示】
如果您想保留这些默认值并添加额外的排除,可以使用spring.devtools.restart.additional- rejection属性。

20.2.2 看更多路径

当您对不在类路径上的文件进行更改时,您可能希望您的应用程序重新启动或重新加载。为此,使用spring.devtools.restart.additional-paths属性配置其他路径以监视更改。您可以使用上述的spring.devtools.restart.exclude属性来控制在附加路径下的更改是触发完全重新启动,还是只触发一个实时重载
20.2.3禁用重启

如果不想使用restart特性,可以使用spring.devtools.restart.enabled属性禁用它。在大多数情况下,您可以在应用程序中设置它。属性(这仍然会初始化restart classloader,但它不会监视文件更改)。
例如,如果您需要完全禁用重新启动支持,因为它不能使用特定的库,您需要在调用springapplication .run(…)之前设置一个系统属性。例如:

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

20.2.4 使用trigger file

如果您使用的IDE不断地编译已更改的文件,您可能更希望只在特定的时间触发重新启动。要做到这一点,您可以使用一个“触发文件”,它是一个特殊的文件,当您想要实际触发重新启动检查时,必须对它进行修改。更改文件只会触发检查,只有当Devtools检测到它必须做一些事情时才会发生重新启动。触发器文件可以手动更新,也可以通过IDE插件更新。
要使用触发器文件,请使用spring.devtools.restart. triggerfile属性。
【提示】
您可能希望将spring.devtools.restart.trigger-file设置为全局设置,以便所有项目都以相同的方式运行。

20.2.5定制重启classloader

如上面的重启vs重载小节所述,使用两个classloaders实现了Restart功能。然而,对于大多数应用程序来说,这种方法工作得很好,有时会导致类加载问题。
默认情况下,您的IDE中的任何开放项目都将使用“重启”类加载程序和任何常规程序加载。将使用“基本”类加载器加载jar文件。如果您正在处理一个多模块项目,而不是将每个模块导入到IDE中,那么您可能需要自定义一些东西。为此,您可以创建一个META-INF/spring-devtools.properties文件。
spring-devtools。属性文件可以包含restart. exclusive .和restart.include。前缀的属性。include元素是应该拖到“重启”类加载器中的项,而排除元素是应该下推到“基”类加载器中的项。属性的值是将应用到类路径的regex模式。

例子:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

[注]
所有属性键必须是唯一的。只要一个属性从restart开始,包括。或restart.exclude。它将被考虑。
【提示】
所有meta - inf / spring-devtools。类路径中的属性将被加载。您可以在项目内部或项目所使用的库中打包文件。

20.2.6已知限制

对于使用标准ObjectInputStream反序列化的对象,重新启动功能不能正常工作。如果需要反序列化数据,可能需要结合使用Spring的ConfigurableObjectInputStream和thread (). getcontextclassloader()。
不幸的是,一些第三方库在不考虑上下文类加载器的情况下反序列化。如果发现这样的问题,您将需要向原始作者请求修复。

20.3 LiveReload

spring-boot-devtools模块包含一个嵌入式LiveReload服务器,当资源发生更改时,该服务器可用于触发浏览器刷新。LiveReload的浏览器扩展可以从livereload.com免费获得Chrome、Firefox和Safari浏览器。
如果您不想在应用程序运行时启动LiveReload服务器,则可以设置spring.devtools.livereload.enabled属性为false。
[注]
一次只能运行一个livereload.com服务器。在启动应用程序之前,请确保没有其他LiveReload服务器正在运行。如果您从IDE启动多个应用程序,那么只有第一个应用程序支持LiveReload。

20.4全局设置

您可以通过添加名为.spring-boot-devtools的文件来配置全局devtools设置。属性到$HOME文件夹(注意文件名以“.”开头)。任何添加到该文件的属性都将应用于使用devtools的计算机上的所有Spring引导应用程序。例如,要配置restart始终使用trigger file,您可以添加以下内容:
~ / .spring-boot-devtools.properties。

spring.devtools.reload.trigger-file=.reloadtrigger

20.5远程应用程序

Spring Boot developer工具不仅局限于本地开发。在远程运行应用程序时,您还可以使用一些特性。远程支持是可选的,为了启用它,您需要确保将devtools包含在重新打包的归档文件中:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

然后需要设置一个spring.devtools.remote.secret属性,例如:

spring.devtools.remote.secret=mysecret

(警告)
在远程应用程序上启用spring-boot-devtools是安全风险。您不应该在生产部署中启用支持。

远程devtools支持分为两部分;有一个接受连接的服务器端端点和一个在IDE中运行的客户端应用程序。在设置好spring.devtools.remote.secret属性后,服务器组件将自动启用。必须手动启动客户端组件。

20.5.1运行远程客户端应用程序

远程客户端应用程序设计为在IDE中运行。您需要使用与正在连接的远程项目相同的类路径来运行org.springframe .boot.devtools. remotespringapplication。传递给应用程序的非选项参数应该是连接到的远程URL。
例如,如果您正在使用Eclipse或STS,并且您已经将一个名为my-app的项目部署到Cloud Foundry,那么您将执行以下操作:
从“运行”菜单中选择“运行配置”。
创建一个新的Java应用程序“启动配置”。
浏览my-app项目。
使用org.springframe .boot.devtools. remotespringapplication作为主类。
添加https://myapp.cfapps。io到程序参数(或任何远程URL)。
运行中的远程客户端将如下所示:

.   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote :: 1.5.14.RELEASE

2015-06-10 18:25:06.632  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)
2015-06-10 18:25:06.671  INFO 14938 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043  WARN 14938 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074  INFO 14938 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2015-06-10 18:25:07.130  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)

[注]
因为远程客户端使用与实际应用程序相同的类路径,所以可以直接读取应用程序属性。这就是spring.devtools.remote.secret属性的读取方式,并将其传递给服务器进行身份验证。
【提示】
最好使用https://作为连接协议,这样通信就会被加密,密码也不会被截获。
【提示】
如果需要使用代理访问远程应用程序,请配置spring.devtools.remote.proxy.host和spring.devtools.remote.proxy.port属性。

20.5.2远程更新

远程客户端将以与本地重新启动同的方式监视应用程序类路径的更改。任何更新的资源将被推到远程应用程序,并(如果需要)触发重新启动。如果您正在迭代一个使用本地没有的云服务的特性,这将非常有用。通常远程更新和重新启动要比完整的重新构建和部署周期快得多。
[注]
只有在远程客户端运行时才对文件进行监视。如果在启动远程客户端之前更改文件,则不会将其推到远程服务器。

20.5.3远程调试隧道

Java远程调试在诊断远程应用程序的问题时非常有用。不幸的是,当您的应用程序部署在数据中心之外时,并不总是可以启用远程调试。如果您正在使用基于容器的技术(如Docker),则远程调试也可能会非常棘手。

为了解决这些限制,devtools支持通过HTTP对远程调试流量进行隧道传输。远程客户端在端口上提供本地服务器8000,您可以将其附加到远程调试器。建立连接后,调试流量将通过HTTP发送到远程应用程序。spring.devtools.remote.debug.local-port 如果您想使用其他端口,则可以使用该属性。

您需要确保您的远程应用程序启动时启用了远程调试。通常这可以通过配置来实现JAVA_OPTS。例如,使用Cloud Foundry,您可以将以下内容添加到您的manifest.yml

---
    env:
        JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"

【提示】
注意,不需要将address=NNNN选项传递给-Xrunjdwp。如果省略的话,Java将选择一个随机的自由端口。
[注]
通过Internet调试远程服务可能很慢,您可能需要增加IDE中的超时。例如,在Eclipse中您可以选择Java→调试器调试从偏好…并改变超时(ms)一个更合适的值(60000适用在大多数情况下)。
(警告)
当使用IntelliJ IDEA的远程调试通道时,必须将所有断点配置为挂起线程而不是VM。默认情况下,IntelliJ IDEA中的断点会挂起整个VM,而不是只挂起命中断点的线程。这有一个不必要的副作用,即挂起管理远程调试隧道的线程,导致调试会话冻结。当使用IntelliJ IDEA的远程调试通道时,所有的断点都应该被配置为挂起线程而不是VM。详情请见IDEA-165769 。

21 打包生产程序

可执行jar可用于生产部署。由于它们是自包含的,它们也非常适合基于云的部署。
对于其他“production ready”特性,如health, auditing and metric REST or JMX end-points。有关详细信息请参见 第V部分“Spring Boot Actuator:生产就绪功能”

22.接下来读什么

您现在应该对如何使用Spring Boot以及您应遵循的一些最佳实践有了很好的理解。您现在可以继续深入了解特定的 Spring Boot功能,或者可以跳过并阅读Spring Boot 的“ 生产准备 ”部分。

转载于:https://my.oschina.net/u/128964/blog/1831575

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值