Spring Boot 2.2.0
正式发布了,可从 repo.spring.io 或是 Maven
Central 获取。

理解Spring Boot

澳门新葡萄京官网注册 1

性能提升

Spring Boot 2.2.0
的性能获得了很大的提升。现在,应用程序启动速度更快,并且消耗的内存更少。这在具有非常严格的内存约束的环境中特别有用。

理解Spring Boot

Spring
Boot是一个偏执的开源框架,它可用于创建可执行的Spring应用程序,采用了习惯优于配置的方法。
此框架的神奇之处在于@EnableAutoConfiguration注释,此注释自动载入应用程序所需的所有Bean——这依赖于Spring
Boot在类路径中的查找。

springboot

延迟初始化

现在可以通过 spring.main.lazy-initialization
属性启用全局延迟初始化,以减少启动时间。不过,使用此功能需要付出一定代价:

  • 在进行任何延迟的初始化时,HTTP 请求的处理可能需要更长的时间
  • 通常在启动时会发生的故障现在在启动后才会出现

一、@Enable*注释

@Enable*注释并不是新发明的注释,早在Spring
3框架就引入了这些注释,用这些注释替代XML配置文件。
很多Spring开发者都知道@EnableTransactionManagement注释,它能够声明事务管理;@EnableWebMvc注释,它能启用Spring
MVC;以及@EnableScheduling注释,它可以初始化一个调度器。
这些注释事实上都是简单的配置,通过@Import注释导入。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ EnableAutoConfigurationImportSelector.class,
        AutoConfigurationPackages.Registrar.class })
public @interface EnableAutoConfiguration {

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     */
    Class[] exclude() default {};

}

EnableAutoConfigurationImportSelector类使用了Spring
Core包的SpringFactoriesLoader类的loadFactoryNamesof()方法。
SpringFactoriesLoader会查询META-INF/spring.factories文件中包含的JAR文件。
当找到spring.factories文件后,SpringFactoriesLoader将查询配置文件命名的属性。在例子中,是org.springframework.boot.autoconfigure.EnableAutoConfiguration。
让我们来看看spring-boot-autoconfigure
JAR文件,它真的包含了一个spring.factories文件,内容如下:

# Initializers
org.springframework.context.ApplicationContextInitializer=
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,
org.springframework.boot.autoconfigure.data.JpaRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.MongoRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration,
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,
org.springframework.boot.autoconfigure.jms.JmsTemplateAutoConfiguration,
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,
org.springframework.boot.autoconfigure.mongo.MongoTemplateAutoConfiguration,
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration

在这个文件中,可以看到一系列Spring
Boot自动配置的列表。下面我们来看这些配置的细节,以MongoAutoConfiguration为例:

@Configuration
@ConditionalOnClass(Mongo.class)
@EnableConfigurationProperties(MongoProperties.class)
public class MongoAutoConfiguration {

    @Autowired
    private MongoProperties properties;

    private Mongo mongo;

    @PreDestroy
    public void close() throws UnknownHostException {
        if (this.mongo != null) {
            this.mongo.close();
        }
    }

    @Bean
    @ConditionalOnMissingBean
    public Mongo mongo() throws UnknownHostException {
        this.mongo = this.properties.createMongoClient();
        return this.mongo;
    }

}

这个类进行了简单的Spring配置,声明了MongoDB所需典型Bean。
这个类跟其它很多类一样,重度依赖于Spring Boot注释:
1)@ConditionOnClass激活一个配置,在类路径中只能存在一到几个这样的类。
2)@EnableConfigurationProperties自动映射一个POJO到Spring
Boot配置文件(默认是application.properties文件)的属性集。
3)@ConditionalOnMissingBean启用一个Bean定义,但必须是这个Bean之前未定义过才有效。
还可以使用@
AutoConfigureBefore注释、@AutoConfigureAfter注释来定义这些配置类的载入顺序。

以 Java 8 为基准
Spring Boot 2.0 要求 Java 版本必须 8 以上, Java 6 和 7 不再支持。

支持 Java 13

Spring Boot 2.2 现在支持 Java 13,同时仍与 Java 11 和 8 兼容。

二、属性映射

下面看MongoProperties类,它是一个Spring Boot属性映射的例子:

@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {

    private String host;
    private int port = DBPort.PORT;
    private String uri = "mongodb://localhost/test";
    private String database;

    // ... getters/ setters omitted
}

@ConfigurationProperties注释将POJO关联到指定前缀的每一个属性。例如,spring.data.mongodb.port属性将映射到这个类的端口属性。
强烈建议Spring Boot开发者使用这种方式来删除与配置属性相关的瓶颈代码。

内嵌容器包结构调整

不可变的 @ConfigurationProperties 绑定

配置属性现在支持基于构造函数的绑定,该绑定使 @ConfigurationProperties
注释的类不可变。可以通过使用 @ConstructorBinding 注释
@ConfigurationProperties
类或其构造函数之一来启用基于构造函数的绑定。可以在配置属性绑定提供的构造函数参数上使用
@DefaultValue 和 @DateTimeFormat 之类的注释。

三、@Conditional注释

Spring Boot的强大之处在于使用了Spring
4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。
澳门新葡萄京官网注册,在Spring
Boot的org.springframework.boot.autoconfigure.condition包中说明了使用@Conditional注释能给我们带来什么,下面对这些注释做一个概述:

@ConditionalOnBean @ConditionalOnClass @ConditionalOnExpression
@ConditionalOnMissingBean @ConditionalOnMissingClass
@ConditionalOnNotWebApplication @ConditionalOnResource
@ConditionalOnWebApplication

以@ConditionalOnExpression注释为例,它允许在Spring的EL表达式中写一个条件。

@Conditional(OnExpressionCondition.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface ConditionalOnExpression {

    /**
     * The SpEL expression to evaluate. Expression should return {@code true} if the
     * condition passes or {@code false} if it fails.
     */
    String value() default "true";

}

在这个类中,我们想利用@Conditional注释,条件在OnExpressionCondition类中定义:

public class OnExpressionCondition extends SpringBootCondition {

    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // ...
        // we first get a handle on the EL context via the ConditionContext

        boolean result = (Boolean) resolver.evaluate(expression, expressionContext);

        // ...
        // here we create a message the user will see when debugging

        return new ConditionOutcome(result, message.toString());
    }
}

在最后,@Conditional通过简单的布尔表达式(即ConditionOutcome方法)来决定。

为了支持 reactive 使用场景,内嵌的容器包结构被重构了的幅度有点大。
EmbeddedServletContainer 被重命名为 WebServer,并且 
org.springframework.boot.context.embedded 包被重定向到了 
org.springframework.boot.web.embedded 包下。举个例子,如果你要使用 
TomcatEmbeddedServletContainerFactory 回调接口来自定义内嵌 Tomcat 容器,
你现在应该使用 TomcatServletWebServerFactory。

RSocket 支持

已为 RSocket 添加了广泛的自动配置,以及新的启动程序
spring-boot-starter-rsocket。当 spring-security-rsocket
位于类路径上时,还会自动配置 Spring Security 的 RSocket 集成。

其余具体更新内容见发布公告。

(文/开源中国)    

四、应用程序上下文初始化器

spring.factories还提供了第二种可能性,即定义应用程序的初始化。这使得我们可以在应用程序载入前操纵Spring的应用程序上下文ApplicationContext。
特别是,可以在上下文创建监听器,使用ConfigurableApplicationContext类的addApplicationListener()方法。
AutoConfigurationReportLoggingInitializer监听到系统事件时,比如上下文刷新或应用程序启动故障之类的事件,Spring
Boot可以执行一些工作。这有助于我们以调试模式启动应用程序时创建自动配置的报告。
要以调试模式启动应用程序,可以使用-Ddebug标识,或者在application.properties文件这添加属性debug=
true。

Servlet-specific 的 server properties 调整

五、调试Spring Boot自动配置

Spring
Boot的官方文档(
Boot会产生一个报告,如下:

Positive matches:
-----------------

   MessageSourceAutoConfiguration
      - @ConditionalOnMissingBean (types: org.springframework.context.MessageSource; SearchStrategy: all) found no beans (OnBeanCondition)

   JmxAutoConfiguration
      - @ConditionalOnClass classes found: org.springframework.jmx.export.MBeanExporter (OnClassCondition)
      - SpEL expression on org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration: ${spring.jmx.enabled:true} (OnExpressionCondition)
      - @ConditionalOnMissingBean (types: org.springframework.jmx.export.MBeanExporter; SearchStrategy: all) found no beans (OnBeanCondition)

   DispatcherServletAutoConfiguration
      - found web application StandardServletEnvironment (OnWebApplicationCondition)
      - @ConditionalOnClass classes found: org.springframework.web.servlet.DispatcherServlet (OnClassCondition)


Negative matches:
-----------------

   DataSourceAutoConfiguration
      - required @ConditionalOnClass classes not found: org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)

   DataSourceTransactionManagerAutoConfiguration
      - required @ConditionalOnClass classes not found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)

   MongoAutoConfiguration
      - required @ConditionalOnClass classes not found: com.mongodb.Mongo (OnClassCondition)

   FallbackWebSecurityAutoConfiguration
      - SpEL expression on org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration: !${security.basic.enabled:true} (OnExpressionCondition)

   SecurityAutoConfiguration
      - required @ConditionalOnClass classes not found: org.springframework.security.authentication.AuthenticationManager (OnClassCondition)

   EmbeddedServletContainerAutoConfiguration.EmbeddedJetty
      - required @ConditionalOnClass classes not found: org.eclipse.jetty.server.Server,org.eclipse.jetty.util.Loader (OnClassCondition)

   WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#localeResolver
      - @ConditionalOnMissingBean (types: org.springframework.web.servlet.LocaleResolver; SearchStrategy: all) found no beans (OnBeanCondition)
      - SpEL expression: '${spring.mvc.locale:}' != '' (OnExpressionCondition)

   WebSocketAutoConfiguration
      - required @ConditionalOnClass classes not found: org.springframework.web.socket.WebSocketHandler,org.apache.tomcat.websocket.server.WsSci (OnClassCondition)

对于每个自动配置,可以看到它启动或失败的原因。

大量的 Servlet 专属的 server.* properties 被移到了 server.servlet
下:

六、结论

Spring Boot很好地利用了Spring
4框架的功能,可以创建一个自动配置的可执行JAR。
不要忘记,可以使用自己的配置来替代自动配置,见:

over!

Boot 理解Spring Boot Spring
Boot是一个偏执的开源框架,它可用于创建可执行的Spring应用程序,采用了习惯优于配置的方法。
此框架的…

澳门新葡萄京官网注册 2

Server

由此可以看出一些端倪,那就是 server 不再是只有 servlet
了,还有其他的要加入。

Actuator 默认映射

Actuator 的端点(endpoint)现在默认映射到 /application,
比如,/info 端点现在就是在 /application/info。但你可以使用 management.context-path 来覆盖此默认值。

@ConditionalOnBean

@ConditionalOnBean 现在的判断条件由 OR 变为了 AND。

Remote CRaSH shell

1.5 的时候此远程工具被标为 deprecated,2.0 的时候将会把这个支持彻底
remove 掉,以及基于此功能的项目也会被删除掉。

Spring Loaded 不再支持

由于 Spring Loaded 项目已被移到了 attic 了,所以不再支持 Spring Loaded
了。现在建议你去使用 Devtools。Spring Loaded 不再支持了。

Hazelcast 自动配置不再支持

不能再自动配置 HazelcastInstance 进行缓存。
因此,spring.cache.hazelcast.config 属性不再可用。

默认 connection pool 变了

默认的连接池已经由 Tomcat 切换到了 HikariCP。如果你过去使用
spring.datasource.type 在基于 Tomcat 的应用程序中强制使用
Hikari,现在你可以删除这个覆盖了。同样的,如果想要使用 Tomcat
的连接池,只需要简单的加入以下配置就可以了:

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

Servlet Filters

针对一个 Filter 默认的 dispatcher 类型现在为
DipatcherType.REQUEST,这样就保证了 Spring Boot 和 Servlet
默认的配置统一了。

Spring Security

Spring Security 的 filter 现在可以自动配置如下类型了: ASYNC, ERROR, and
REQUEST 。这样就让 Spring Boot 中的配置和 Spring Security
默认配置保持一致了。

Spring Session

Spring Session 的 filter 现在支持自动配置如下 dispatcher 类型 ASYNC,
ERROR, and REQUEST 。同样是为了让 Spring Boot 的配置与 Spring Session
的默认配置保持一致。值得注意的是从 Spring Session 2.0 起, Mongo 和
GemFire 将不再被支持。

Jetty

要求 Jetty 最低版本为 9.4。

Tomcat

要求 Tomcat 最低版本为 8.5。

Hibernate

要求 Hibernate 最低版本为 5.2。

Gradle

要求 Gradle 最低版本为 3.4。

SendGrid

SendGrid 最低支持版本是 3.2。为了支持这次升级,username 和 password
已经被干掉了。因为 API key 现在是唯一支持的认证方式。

Starter 的传递依赖的改变

以前有几个 Spring Boot starter 是依靠 Spring MVC 和 spring-boot-starter-web 传递的。
为了对 Spring WebFlux 的支持,
spring-boot-starter-mustache 和 spring-boot-starter-thymeleaf 不再依赖 spring-boot-starter-web。
现在你要自己选择并添加 spring-boot-starter-web 或 spring-boot-starter-webflux 作为依赖。

记住:web 和 webflux 是平行的关系。我们之前的文章中提到过 spring
webflux。你可以移步查看:Spring 5 新增全新的
reactive web 框架:webflux。

Solr 健康指标

针对 Solr 的健康检查信息不再是 solrStatus 这个属性了。现在是 status
property,是一个标准状态属性,对应于一个的整型值。

默认代理策略

Spring Boot 现在默认是使用 CGLIB 代理,同时包含 AOP
支持。如果你需要基于代理(proxy-based)的代理策略,你需要把
spring.aop.proxy-target-class 设置为 false。

基于 CLI 的测试

从 Spring Boot 的 CLI 中删除了测试支持,现在建议你使用 Maven 或 Gradle
构建应用程序,去使用它们提供的丰富的测试支持吧。

@ConfigurationProperties

@ConfigurationProperties 里的 ignoreNestedProperties 属性已被删除。

Multipart 配置改变

为了更好的反映 Servlet 的特性, spring.http.multipart. 属性已经被命名为
spring.servlet.multipart

ps:其实就是因为 webflux 来了,只能把 servlet 和 webflux 区分开来。

Mustache 模板默认文件扩展名

过去 Mustache 模板的默认的文件扩展名是.html。现在.mustache
成了官方指定的扩展名,而且很多的 IDE 插件已经支持了此后缀。你可以通过
spring.mustache.suffix 来覆盖现在的默认的支持。

Spring Framework 5.0

Spring Boot 2.0 是建立在 Spring Framework 5.0 之上的(最低要求)。Spring
5 最大的亮点就是 reactive。

松绑定改善

松绑定已经得到改善。这里简单的举个例子:

简单的属性在删除特殊字符然后转成小写后进行绑定。比如:

下面的属性最终都会被映射为 spring.jpa.databaseplatform=mysql:

spring.jpa.database-platform=mysql

spring.jpa.databasePlatform=mysql

spring.JPA.database_platform=mysql

有关详细信息,我们可以查阅:https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0

WebFlux 和 WebFlux.fn 支持

Spring Boot 2.0 提供了一个新的 starter ,用来支持 Reactive Spring web
frameworks。该 starter 为 spring-boot-starter-webflux。其中 Reactor
Netty 是默认的 web 引擎(spring-boot-starter-reactor-netty)。

Reactive 数据库支持

Spring Boot 2.0 对一下的数据库提供了自动配置( auto-configuration )的
reactive 的支持:

*   MongoDB (spring-boot-starter-data-mongodb-reactive)
*   Redis (spring-boot-starter-data-redis-reactive)
*   Cassandra (spring-boot-starter-data-cassandra-reactive)

@DataMongoTest 测试注解也是支持 reactive 的。

@WebFluxTest 支持

Reactive controller 现在可以使用 @WebFluxTest 来测试。它提供的功能和
@WebMvcTest 类似。而且 WebTestClient
可以直接使用,已经被自动配置(auto-configured)了。

支持使用 @SpringBootTest 自动配置 WebTestClient

当你使用 @SpringBootTest with an actual server (that is, either
DEFINEDPORT or RANDOMPORT), a WebTestClient is available the same way
TestRestTemplate is.

使用 @SpringBootTest 进行 WebTestClient 自动配置

将 @SpringBootTest 用于实际服务器(即 DEFINEDPORT 或 RANDOMPORT)时,
    WebTestClient 的可用方式与 TestRestTemplate 相同。

Gradle 插件

Spring Boot 的 Gradle
插件已在很大程度上被重写,以实现一些重大的改进。有关这方面的就不细讲了,感兴趣的同学可以去一探究竟。

/loggers 端点 POST 的状态码改变

针对 /loggers 端点上 POST 操作的状态码已又 200 改为 204。

Elasticsearch

Elasticsearch 已升级到 5.4。 与 Elastic 公司宣布不再支持嵌入式
Elasticsearch 的情况一样,NodeClient
的自动配置已被删除。就是这么的节奏一致。现在你可以通过使用
`spring.data.elasticsearch.cluster-nodes 自动配置 TransportClient,具体
value 可以是一个或多个要连接的节点的地址。

Quartz Scheduler

Spring Boot 2 针对 Quartz 调度器提供了支持。你可以加入
spring-boot-starter-quartz starter 来启用。而且支持基于内存和基于 jdbc
两种存储。

Spring Data Web 配置

Spring Boot 公开了一个新的 spring.data.web
配置名称空间,可以轻松配置分页和排序。

Json starter

一个全新的 spring-boot-starter-json starter 聚合了很多常用的 json 工具,可以支持对 json 的读写。

它不仅仅提供了 jackson-databind 而且当你使用 java8 时候,
还提供了有用的模块:
jackson-datatype-jdk8, jackson-datatype-jsr310 和 jackson-module-parameter-names。

之前使用 jackson-databind 的地方就可以使用这个新的 starter 了。

Thymeleaf starter

Thymeleaf starter 现在包含了 thymeleaf-extras-java8time,开箱即用。

InfluxDB

如果 InfluxDB java client 和 the spring.influx.url 被设置, 一个 InfluxDB
client 现在就会被自动配置。而且现在支持认证。

JdbcTemplate

Spring Boot 自动配置(auto-configuration)的 JdbcTemplate 现在可以通过
spring.jdbc.template 命名空间进行定制。
此外,自动配置(auto-configuration)的 NamedParameterJdbcTemplate
在底层就是 JdbcTemplate。

jOOQ

Spring Boot 现在可以根据 DataSource 自动检测出 jOOQ 方言(类似于 JPA
方言)。

此外,还引入了 @JooqTest 用于只有 jOOQ 才能 hold 的测试场景。

@DataRedisTest

新加了一个测试的时候针对 redis 的新注解。

强大的 Mongo 客户端自定义

现在可以通过 MongoClientSettingsBuilderCustomizer 这个 bean 来高度定制化
Spring Boot 的 Mongo 客户端。

Cassandra

spring.data.cassandra 现在支持池化(pooling)。

Kafka listener 支持批量消费

现在支持一次性批量消费多个
ConsumerRecord,你可以创建一批的监听器(listener),这样设置:

spring.kafka.listener.type=batch

Web filters 初始化

Web filters 现在在所有支持的容器中都会被立刻初始化。也就是
eagerly,急加载。

Auto-configuration 报告

现在不满足条件(unconditional)的 class
也会被包含进来,在自动配置(auto-configuration)的 Actuator 端点的
response 中一并返回。

重置 logger 操作

现在 Loggers 端点(endpoint) 支持 reset 日志级别到默认设置。

Maven 插件属性

插件的配置属性现在的暴露方式有所改变,现在所有的都是以 spring-boot
为前缀,这是为了避免和其他插件冲突而导致错误。

比如,以下命令行可以启用 profile foo:

mvn spring-boot:run -Dspring-boot.run.profiles=foo

Devtools 远程调试

已经从 Devtools 中删除了通过 HTTP 进行远程调试的支持。(#9489)

Jetty

为了和 Tomcat 和 Undertow 看齐,现在对 Jetty 的所有的 http method
的请去都进行压缩,而不是之前那样只对 GET request 进行压缩(#8184)。

Reactive server 自定义

当配置一个 reactive web server 时,针对 Jetty,Tomcat,Undertow
的定制化器现在会被调用 (#9572)。

Jolokia

Jolokia 不再是一个 endpoint。并且默认是禁用的,这已和其他的 web
端点保持了一直。它的配置已转移到了 management.jolokia。如果想启用
Jolokia, 向你的配置加入 management.jolokia.enabled=true 就可以了。

数据库迁移

Liquibase 和 Flyway 配置的 key 已被转移到了 spring 的命名空间下:(比如:
spring.liquibase and spring.flyway )。

Auto-configuration 排序

@AutoConfigureOrder 默认值由 Ordered.LOWEST_PRECEDENCE 变为 0。 (#10142)

Auto-configuration 测试工具

一个新的 ApplicationContextRunner 测试工具让我们测试自动配置变得容易。
未来将会把所有的测试套件都迁移到这个模型上。

Java 9 支持

基本支持了 Java 9。之所以是“基本”,是因为还没得到用户的验证。

Jedis 变为了 Lettuce

Redis 客户端驱动现在由 Jedis 变为了 Lettuce。使用 Jedis 的同学们,大概知道方向了吧。

但仍然支持 Jedis,那么 exclude 掉 io.lettuce:lettuce-core,然后添加 redis.clients:jedis 就是了。

OAuth 2.0 支持

Spring Security OAuth 项目中的功能将会迁移到 Spring Security 中。将会 OAuth 2.0。

Mockito 1.x

Mockito 1.x 不再支持 @MockBean 和 @SpyBean。 
如果你不使用 spring-boot-starter-test 来管理依赖关系,则应升级到 Mockito 2.x。

JSON-B 支持

除了 Jackson 和 Gson,现在还支持了 JSON-B 。JSON 测试支持也已更新为新的
JsonbTester 类。

Session Endpoint

Spring Session 用现在可以通过 /application/sessions Actuator Endpoint 进行查找和删除 session。

ConfigurationProperties 验证

如果你希望 @ConfigurationProperties 对象上开启验证,那么只需要添加 @Validated 就可以了。

Spring Mobile

针对 Spring Mobile 的自动配置和依赖不再支持,已被删除。

Spring WebFlux 支持错误约定

Spring Boot 现在让 WebFlux 的错误约定和 MVC 保持一致就像使用 MVC
一样:默认视图和 JSON 响应错误,自定义错误视图等等。

TLS 配置 和 HTTP/2 支持

你现在可以为你的 WebFlux 应用配置 SSL,使用 server.ssl.* 配置属性。
Tomcat, Jetty, Undertow 和 Reactor Netty 都支持。

你现在也可以为你的 MVC 或 WebFlux 应用配置 HTTP/2:

使用 server.http2.enabled。

@KafkaListener支持使用@SendTo

使用了自动配置工厂的 Kafka listener 现在支持 @SendTo。

Kotlin 扩展

Spring Boot 2.0 发布了 Kotlin runApplication 扩展:

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication

import org.springframework.boot.runApplication

@SpringBootApplication

class DemoApplication

fun main(args: Array) {
runApplication(*args)
}

Job command line runner 顺序

CommandLineRunner 现在执行批处理 job 的启动 order 是 0。

支持自动配置的模板化欢迎页

Spring Boot 2.0
现在支持静态和模板化两种欢迎页类型。它会首先去配置好的静态内容的目录下查找
index.html 文件,如果没找到,然后就去查找 index 模板。
只要找到了一个就会被用作欢迎页。

Context path 会在启动时被打印

在 Spring Boot 之前的版本中,对 context path
貌似并没有那么的重视一样。现在当我们使用内嵌容器的时候, context path
会被打印在 HTTP 端口的旁边,像这样:

Tomcat started on port(s): 8080 (http) with context path ‘/foo’

测试优化,自动扫描 Converter 和 GenericConverter

Converter 和 GenericConverter beans 现在可以被 @WebMvcTest 和 @WebFluxTest 自动扫描到了。

Health vs. Status

status endpoint 已经被删除了,现在改成了 health。这个 health
端点既可以展示 status 也可以有更多的细节。 health
端点现在默认是被暴露的(只展示
status)。如果你希望展示更多的细节信息,可以通过修改属性
management.endpoints.health.show-details来实现:

management.endpoints.health.show-details=true

原文链接:代码湾-Spring Boot 2.0
新特性和发展方向