Spring Framework 5.x中有什么新功能
5.1版中的新功能
一般核心修订
- 基础设施:
- 在类路径和模块路径上对JDK 11的无警告支持。
- 支持Graal原生图像约束(反射,参数名称)。
- 升级到Reactor Core 3.2和Reactor Netty 0.8(“Reactor Californium”)。
- 升级到ASM 7.0和CGLIB 3.2.8。
- 核心设施:
- FileSystemResource中的NIO.2路径支持(取代PathResource)。
- 核心类型和注释解析的性能改进。
- 一致地检测通用接口上的方法注释。
- 记录修订:
- 可以通过标准的Commons Logging检测Spring的JCL桥。
- 减少信息噪音,可读的调试日志,跟踪级别的详细信息。
核心容器
- Bean定义:
- 支持@Profile条件中的逻辑和/或表达式。
- 嵌套配置类的一致(非)检测。
- 精制Kotlin DSL。
- 相同类型的多个bean的唯一隐式bean名称。
- Bean检索:
- 在BeanFactory API中一致地不暴露零bean。
- 通过BeanFactory API进行编程的ObjectProvider检索。
- ObjectProvider可以为bean-of-type解析的可迭代/流访问。
- 单个构造函数场景中的空集合/映射/数组注入。
一般网站修订
- 在接口上也可以检测到控制器参数注释:
- 允许在控制器接口中完成映射合同。
- 支持更严格的URI变量编码
UriComponentsBuilder
:- 请参阅参考资料中更新的“URI编码”。
- Servlet使用HTTP PUT,PATCH和DELETE请求params:
- 请参阅“表单数据”。
Spring Web MVC
- 记录
- 改进,人性化,紧凑,DEBUG和TRACE记录。
- 控制潜在敏感数据的DEBUG记录。
- 通过
DispatcherServlet#enableLoggingRequestDetails
- 通过
- 更新的Web区域设置表示:
- 语言标签默认符合。
- CookieLocaleResolver发送符合RFC6265的时区cookie。
- 缺少标头,cookie,路径变量的特定MVC异常:
- 允许区分异常处理和状态代码。
- 外部配置的基本路径,用于注释控制器集。
- 通过以下方式集中处理“转发”类型标头
ForwardedHeaderFilter
:- 请参阅重要的升级说明。
- 除了GZip之外,还支持为Brotli提供预编码的静态资源。
Spring WebFlux
- 使用Reactor Netty 0.8运行时支持HTTP / 2服务器。
- 记录
- 改进,人性化,紧凑,DEBUG和TRACE记录。
- HTTP请求和WebSocket会话的相关日志消息。
- 控制潜在敏感数据的DEBUG记录。
- 通过
CodecConfigurer#defaultCodecs
- 通过
- 会话cookie现在必须
SameSite=Lax
防止CSRF攻击: - DSL增强功能:
RouterFunction
没有静态导入的DSL样式构建器(示例)。- 精制Kotlin路由器DSL。
- 外部配置的基本路径,用于注释控制器集。
- 第三方集成:
- WebSocket的:
- 支持
WebSocketSession
属性。 - 改进有关反应式WebSocket API处理的文档。
- 支持
- 除了GZip之外,还支持为Brotli提供预编码的静态资源。
spring消息
- 在@MessageMapping方法中支持被动客户端:
- 对Reactor和RxJava返回值的开箱即用支持。
- 选项以保留 STOMP代理的消息发布顺序。
@SendTo
并且@SendToUser
可以既被用于在控制器的方法。- 改进了有关处理消息和订阅的文档。
spring ORM
- 支持Hibernate ORM 5.3:
- Bean容器与Hibernate的新SPI集成。
- LocalSessionFactoryBean和HibernateTransactionManager支持JPA交互:
- 在同一事务中允许本机Hibernate以及JPA访问。
- 只读事务不再在内存中保留Hibernate实体快照:
- Session.setDefaultReadOnly(true)默认情况下。
- SAP HANA作为常见的JpaVendorAdapter数据库平台。
测试
- Hamcrest和XML断言
WebTestClient
。 MockServerWebExchange
可以配置固定WebSession
。
5.0版中有什么新功能
JDK 8+和Java EE 7+ Baseline
- 现在基于Java 8源代码级别的整个框架代码库。
- 通过推断的泛型,lambdas等提高可读性。
- Java 8的条件支持功能现在采用直接代码。
- 与JDK 9完全兼容,可用于开发和部署。
- 在类路径和模块路径上(具有稳定的自动模块名称)。
- 框架构建和测试套件在JDK 9上传递(默认情况下在JDK 8上运行)。
- 现在,Spring的相应功能需要Java EE 7 API级别。
- Servlet 3.1,Bean Validation 1.1,JPA 2.1,JMS 2.0
- 最近的服务器:例如Tomcat 8.5 +,Jetty 9.4 +,WildFly 10+
- 在运行时与Java EE 8 API级别的兼容性。
- Servlet 4.0,Bean Validation 2.0,JPA 2.2,JSON Binding API 1.0
- 针对Tomcat 9.0,Hibernate Validator 6.0,Apache Johnzon 1.1进行了测试
删除了包,类和方法
- 包
beans.factory.access
(BeanFactoryLocator
机制)。 - 包
jdbc.support.nativejdbc
(NativeJdbcExtractor
机制)。 - 包
mock.staticmock
从spring-aspects
模块中删除。- 不再支持
AnnotationDrivenStaticEntityMockingControl
了。
- 不再支持
- 包裹
web.view.tiles2
和orm.hibernate3/hibernate4
丢弃。- 最低要求:现在是Tiles 3和Hibernate 5。
- 删除支持:Portlet,Velocity,JasperReports,XMLBeans,JDO,Guava。
- 建议:如果需要,请继续使用Spring Framework 4.3.x.
- 在代码库中删除了许多已弃用的类和方法。
- 对生态系统中常用方法做出了一些妥协。
一般核心修订
- JDK 8+增强功能:
- 基于Java 8反射增强的高效方法参数访问。
- 核心Spring接口中Java 8默认方法的选择性声明。
- 一致使用JDK 7
Charset
和StandardCharsets
增强功能。
- JDK 9兼容性:
- 避免尽可能在JDK 9中弃用的JDK API。
- 通过构造函数进行一致的实例化(具有修订的异常处理)。
- 防御使用反射核心JDK类。
- 包级别的非null API声明:
- 可明确注释的可为空的参数,字段和返回值
@Nullable
。 - 主要用于IntelliJ IDEA和Kotlin,还有Eclipse和FindBugs。
- 一些Spring API不再容忍null值(例如in
StringUtils
)。
- 可明确注释的可为空的参数,字段和返回值
Resource
抽象提供isFile
了防御性getFile
访问的指标。readableChannel
在Resource
界面中还具有基于NIO的访问器。- 通过NIO.2流访问文件系统(不再
FileInput/OutputStream
使用)。
- Spring Framework 5.0自带了自己的Commons Logging桥:
spring-jcl
而不是标准的Commons Logging; 仍然是排他性/可覆盖的。- 无需任何额外桥接即可自动检测Log4j 2.x,SLF4J,JUL(java.util.logging)。
spring-core
附带ASM 6.0(CGLIB 3.2.5和Objenesis 2.6旁边)。
核心容器
- 支持任何
@Nullable
注释作为可选注入点的指示器。 - 功能风格
GenericApplicationContext
/AnnotationConfigApplicationContext
Supplier
基于bean定义器回调的基于bean的注册API。
- 在接口方法上一致地检测事务,缓存,异步注释。
- 在CGLIB代理的情况下。
- XML配置命名空间简化为未版本化的模式。
- 始终解决最新
xsd
文件; 不支持已弃用的功能。 - 特定于版本的声明仍受支持,但针对最新架构进行了验证。
- 始终解决最新
- 支持候选组件索引(作为类路径扫描的替代方案)。
Spring Web MVC
- Spring提供的
Filter
实现中的完整Servlet 3.1签名支持。 - 支持
PushBuilder
Spring MVC控制器方法中的Servlet 4.0 参数。 MaxUploadSizeExceededException
用于在公共服务器上进行Servlet 3.0多部分解析。- 通过
MediaTypeFactory
委托统一支持常见媒体类型。- 取代Java Activation Framework的使用。
- 与不可变对象的数据绑定(Kotlin / Lombok /
@ConstructorProperties
) - 支持JSON绑定API(使用Eclipse Yasson或Apache Johnzon替代Jackson和GSON)。
- 支持Jackson 2.9。
- 支持Protobuf 3。
- 反应堆3.1支持
Flux
和Mono
以及RxJava 1.3和2.1作为返回值从Spring MVC的控制器方法靶向使用新的反应性的WebClient
(见下文)或Spring MVC控制器弹簧数据活性库。 - 更高效的解析和扩展语法的新
ParsingPathMatcher
替代方案。AntPathMatcher
@ExceptionHandler
方法允许RedirectAttributes
参数(以及flash属性)。- 支持
ResponseStatusException
作为程序替代@ResponseStatus
。 - 支持
Invocable
通过直接呈现使用提供的脚本实现的脚本引擎ScriptEngine#eval(String, Bindings)
,以及ScriptTemplateView
通过新RenderingContext
参数的i18n和嵌套模板。 - Spring的FreeMarker宏(
spring.ftl
)现在使用HTML输出格式(需要FreeMarker 2.3.24+)。
Spring WebFlux
- 新的spring-webflux模块,
spring-webmvc
构建在反应式基础上的替代方案- 完全异步和非阻塞,旨在用于事件循环执行模型与传统的大型线程池(每个请求线程执行模型)。 - 反应性的基础设施中
spring-core
,例如Encoder
和Decoder
对对象的编码和解码流;DataBuffer
抽象,例如使用JavaByteBuffer
或NettyByteBuf
;ReactiveAdapterRegistry
用于控制器方法签名中的反应库的透明支持。 - 反应性基础设施
spring-web
包括HttpMessageReader
和HttpMessageWriter
建立和委托Encoder
和Decoder
; 服务器,HttpHandler
带有适配器(非阻塞)运行时,如Servlet 3.1+容器,Netty和Undertow;WebFilter
,WebHandler
以及Servlet API等价物的其他非阻塞合同替代方案。 @Controller
样式,基于注释的编程模型,类似于Spring MVC,但在WebFlux中支持,在反应堆栈上运行,例如能够支持反应类型作为控制器方法参数,从不阻塞I / O,一直遵守背压HTTP套接字,并在额外的非Servlet容器(如Netty和Undertow)上运行。- 新的函数式编程模型(“WebFlux.fn”)作为
@Controller
基于注释的编程模型的替代方案 - 使用端点路由API进行最小化和透明化,在相同的反应堆栈和WebFlux基础架构上运行。 - 全新
WebClient
的HTTP呼叫功能和反应API,可与RestTemplate
流畅的API 相媲美,并且在基于WebFlux基础设施的非阻塞和流媒体场景中表现优异; 在5.0中,AsyncRestTemplate
不赞成使用WebClient
。
Kotlin的支持
- 使用Kotlin 1.1.50或更高版本时,使用Null安全API。
- 支持带有可选参数和默认值的Kotlin不可变类。
- 功能bean定义Kotlin DSL。
- 用于WebFlux的功能路由Kotlin DSL。
- 利用Kotlin reified类型参数来避免
Class
在各种API(如RestTemplate
WebFlux API)中明确指定用于序列化/反序列化。 - 对
@Autowired
/@Inject
和@RequestParam
/@RequestHeader
/ etc注释的Kotlin零安全支持,以确定是否需要注入点或处理程序方法参数。 ScriptTemplateView
Spring MVC和Spring WebFlux都支持Kotlin脚本。- 类似于数组的setter添加到
Model
,ModelMap
和Environment
。 - 支持带有可选参数的Kotlin自动装配构造函数。
- Kotlin反射用于确定界面方法参数。
测试改进
- 在Spring TestContext Framework中完全支持JUnit 5的Jupiter编程和扩展模型。
SpringExtension
:来自JUnit Jupiter的多个扩展API的实现,它为Spring TestContext Framework的现有功能集提供完全支持。此支持通过@ExtendWith(SpringExtension.class)
。@SpringJUnitConfig
:一个组合的注释,它结合@ExtendWith(SpringExtension.class)
了JUnit Jupiter和@ContextConfiguration
Spring TestContext Framework。@SpringJUnitWebConfig
:一个组合的注释,它结合@ExtendWith(SpringExtension.class)
了JUnit Jupiter@ContextConfiguration
和@WebAppConfiguration
Spring TestContext Framework。@EnabledIf
:表示如果提供的SpEL表达式或属性占位符求值,则启用带注释的测试类或测试方法true
。@DisabledIf
:表示如果提供的SpEL表达式或属性占位符求值,则禁用带注释的测试类或测试方法true
。
- 支持Spring TestContext Framework中的并行测试执行。
- Spring TestContext Framework中测试执行回调之前和之后的新增功能,通过
SpringRunner
(但不是通过JUnit 4规则)支持TestNG,JUnit 5和JUnit 4 。- API和API 中的新增
beforeTestExecution()
和afterTestExecution()
回调。TestExecutionListener
TestContextManager
- API和API 中的新增
MockHttpServletRequest
现在有getContentAsByteArray()
和getContentAsString()
访问内容的方法(即请求体)。- 如果在模拟请求中设置了字符编码,则Spring MVC Test中的
print()
和log()
方法现在会打印请求主体。 - Spring MVC Test中的
redirectedUrl()
和forwardedUrl()
方法现在支持具有可变扩展的URI模板。 - XMLUnit支持升级到2.3。