转载

Spring Framework 5.x 中的新特性

Spring Framework 5.0 中的新功能和增强

JDK 8+ 和 Java EE 7+ 基准版

  • 基于 Java 8 源代码级别的完整框架代码

    • 通过引入泛型、lambda 等提高可读性。

    • 通过直接代码支持 Java 8 功能的条件支持。

  • 方便开发和部署的目的,完全兼容 JDK 9。

    • 在 classpath 和模块路径上(支持稳定自动模块名)。

    • 框架构建和测试组件在 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 机制)。

  • 从 spring-aspects 移除 mock.staticmock 包 。

    • 不再支持 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 类上

  • 包级别的非空 API 声明:

    • 使用 @Nullable 显式注释的可空参数,字段和返回值。

    • 主要用于 IntelliJ IDEA 和 Kotlin,还有 Eclipse 和 FindBugs。

    • 一些 Spring API 不再容许空值(例如 StringUtils)。

  • Resource 为防御性 getFile 访问提供 isFile 指示。

  • Resource 接口中还包含基于 NIO 的可读通道访问器。

  • 通过 NIO.2 流文件系统访问(不再使用 FileInput / OutputStream)。

  • Spring Framework 5.0 自带的 Commons Logging bridge 开箱即用:

  • 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 上支持函数式风格

    • 使用 bean 定义的可定制回调的基于 Supplier 的 bean 注册 API。

  • 在接口方法上持续监测 transaction, caching, async 注释。

    • 在 CGLIB 代理的情况下。

  • 简化的无版本化 schema 的 XML 配置命名空间 。

    • 总是解析最新的 xsd 文件;不支持遗弃的功能。

    • 版本相关声明依然支持,但需要使用最新的 schema 验证。

  • 支持候选组件索引(作为 classpath 扫描的替代项)。

Spring Web MVC

  • 在 Spring 提供的 Filter 实现中完全全支持 Servlet 3.1 特性。

  • 在 Spring MVC 控制器方面中支持 Servlet 4.0 的 PushBuilder 参数。

  • 在常见服务器上支持 Servlet 3.0 的 MaxUploadSizeExceededException 解析 multipart。

  • 通过 MediaTypeFactory 委托统一支持常见媒体类型。

    • 取代 Java Activation Framework。

  • 使用不可变对象进行数组绑定 (Kotlin / Lombok / @ConstructorProperties)

  • 支持绑定 JSON 的 API(代替 Jackson 和 GSON)。

  • 支持 Jackson 2.9。

  • 支持 Protobuf 3。

  • 为了在 Spring MVC 控制器中使用新的响应式 WebClient(见下面)或者 Spring Data Reactive 库,Spring MVC 控制器方法允许返回 Reactor 3.1 Flux 和 Mono,以及 RxJava 1.3 和 2.1。

  • 新的 ParsingPathMatcher 代替 AntPathMatcher,带来更高效的解析和 扩展语法 。

  • @ExceptionHandler 方法允许 RedirectAttributes 参数(还有快速属性)。

  • 支持 ResponseStatusException 代替 @ResponseStatus。

  • 通过直接使用 ScriptEngine#eval(String, Bindings) 渲染脚本来支持未实现 Invocable 的脚本引擎,还通过 RenderingContext 参数支持国际化(i18n)和 ScriptTemplateView 的嵌入模板。

  • Spring 的 FreeMarker 宏 (spring.ftl) 现在使用 HTML 作为输出格式(需要 FreeMarker 2.3.24+)。

Spring WebFlux

  • 新的 spring-webflux 模块基于异步、非阻塞的 响应式编程 ,用来代替 spring-webmvc。与传统的每个请求使用巨大线程池中一个线程的模式不同,响应式编程采用事件循环执行的模型。

  • spring-core 中的响应式基建包括 Encoder 和 Decoder 用于对对象流进行编码和解码;DataBuffer 抽象,比如 Java 的 ByteBuffer 或 Netty 的 ByteBuf;控制器方法签名中的 ReactiveAdapterRegistry 支持响应库。

  • spring-web 中的响应式基建包括 HttpMessageReader 和 HttpMessageWriter,它们基于 Encoder 和 Decoder 创建,并成为其代表;服务器 HttpHandler 适配像 Servlet 3.1+ 容器、Netty 和 Undertow 这样的(非阻塞)运行时;WebFilter、WebHandler 和其它非阻塞协议作为 Servlet API 的等价替代品。

  • @Controller 风格,基于注解的编程模式,与 SprintMVC 相似,但受到 WebFlux 支持,运行于响应栈,比如,它可以支持的响应类型包括控制器方法参数,不阻塞 I/O,关注到 HTTP 套接字的全路径背压,运行在额外的非 Servlet 容器,比如 Netty 和 Undertow。

  • 新的 函数式编程模型 (“WebFlux.fn”)可代替 @Controller,基于注解的编程模型——最小而且透明的终端路由 API,运行于相同的响应栈和 WebFlux 架构。

  • 新的 WebClient 支持在调用 HTTP 时使用函数式编程和响应式 API,能与通过 Fluent API 实现的 RestTemplate 媲美,还擅长基于 WebFlux 架构的非阻塞和流模式;5.0 中已经不推荐使用 AsyncRestTemplte 而应该使用 WebClient。

对 Kotlin 的支持

  • 使用 Kotlin 1.1.50+ 的支持空安全的 API。

  • 支持带可选参数和默认值的 Kotlin 不可变类。

  • 函数式 Bean 定义 Kotlin DSL。

  • 为 WebFlux 支持函数式路由到 Kotlin DSL。

  • 利用 Kotlin 具体的类型参数,在各种 API 中,比如 RestTemplate 和 WebFlux API,显式指定用于序列化/反序列化的类。

  • Kotlin 空安全支持 @Autowired/@Inject 和 @RequestParam/@RequestHeader 等注解,这样可以检查参数 /Bean 是否是必需的。

  • Kotlin 脚本在 ScriptTemplateView 中得到 Spring MVC 和 Spring WebFlux 的支持。

  • 为 Model、ModelMap 和 Environment 添加了类似数组的 setter。

  • 为 Kotlin 自动绑定构造器参数提供可选参数的支持。

  • 使用 Kotlin 反射来确定接口方法参数。

测试提升

  • 在 Spring TestContext 框架中完全支持 JUnit 5 的  J upiter   编程及其扩展模型

    • SpringExtension : 来自 JUnit 的多个扩展 API 的实现,它提供了 Spring TestContext 框架中现有功能集的全部支持。这些支持是通过 @ExtendWith(SpringExtension.class 使能的。

    • @SpringJUnitConfig : 整合来自 JUnit Jupiter 的 @ExtendWith(SpringExtension.class) 与 Spring TestContext 框架的@ContextConfiguration 的复合注解。

    • @SpringJUnitWebConfig : 整合来自 JUnit Jupiter 中的 @ExtendWith(SpringExtension.class) 与来自 Spring TestContext 框架的 @ContextConfiguration 和 @WebAppConfiguration 的复合注解。

    • @EnabledIf : 表示被注解的测试类或测试方法在以下条件是使能的:补充 SpEL 表达式或属性占位符被设置为 true。

    • @DisabledIf : 表示被注解的测试类或测试方法在以下条件是禁用的:补充 SpEL 表达式或属性占位符被设置为 true。

  • 支持 Spring TestContext 框架总的 并行测试执行 。

  • Spring TestContext 框架中新版的 before  和  after  测试执行回调通过 SpringRunner(注意不是通过 JUnit 4 规则)支持 TestNG、JUnit 5 以及 JUnit 4。

    • 在 TestExecutionListener API 和 TestContextManager 中新添加 beforeTestExecution() 和 afterTestExecution() 回调。

  • MockHttpServletRequest 现在有 getContentAsByteArray() 和 getContentAsString() 方法,可用于访问其内容(例如,请求主体)。

  • 如果字符集编码格式已经在 mock 请求中设置,则 Spring MVC 测试中的 print() 和 log() 方法现在将打印请求主体。

  • Spring MVC 测试中的 redirectedUrl() 和 forwardedUrl() 方法现在支持 URI 模板,并支持变量扩展。

  • XMLUnit 支持升级到 2.3 版本。

原文  https://www.oschina.net/translate/whats-new-in-spring-framework-5x
正文到此结束
Loading...