Spring Framework 5.3.0正式发布,在云原生路上继续发力(下)

简介: Spring Framework 5.3.0正式发布,在云原生路上继续发力(下)

@Scheduled中Cron表达式增强


我们经常会在@Scheduled使用Cron表达式,比如0 0 * * * *代表每个小时执行一次,对于这种常用的表达式这么写确实非常不直观,Spring 5.3.0新提出了宏的概念,让你可以用一个英文单词搞定,它由CronExpression提供支持:


CronExpression:
  private static final String[] MACROS = new String[] {
      "@yearly", "0 0 0 1 1 *",
      "@annually", "0 0 0 1 1 *",
      "@monthly", "0 0 0 1 * *",
      "@weekly", "0 0 0 * * 0",
      "@daily", "0 0 0 * * *",
      "@midnight", "0 0 0 * * *",
      "@hourly", "0 0 * * * *"
  };


如:@Scheduled(cron = "@hourly")它就代表每小时执行一次,效果等同于@Scheduled(cron = "0 0 * * * *")。其它的等同效果如上所示。


其它增强


Spring还对最后xxx天、工作日等提供了便捷操作,此处仅做出简单示例,详请还请参见官方文档哈。


image.png


数据访问与事务


新增JdbcTransactionManager类


它继承自DataSourceTransactionManager,它主要是对doCommit、doRollback时产生的异常借助SQLExceptionTranslator实现转换,简单的说可以自定义这个转换器来实现异常转换喽,这在5.3.0之前是写死的:

5.3.0之前DataSourceTransactionManager:
  @Override
  protected void doCommit(DefaultTransactionStatus status) {
    ...
    try {
      con.commit();
    } catch (SQLException ex) {
      throw new TransactionSystemException("Could not commit JDBC transaction", ex);
    }
  }
5.3.0之后DataSourceTransactionManager:
  @Override
  protected void doCommit(DefaultTransactionStatus status) {
    ...
    try {
      con.commit();
    } catch (SQLException ex) {
      throw translateException("JDBC commit", ex);
    }
  }
  // @since 5.3  默认实现是同之前版本使用的TransactionSystemException包装
  // 但子类JdbcTransactionManager对此方法实现了覆盖
  protected RuntimeException translateException(String task, SQLException ex) {
    return new TransactionSystemException(task + " failed", ex);
  }
5.3.0新增的JdbcTransactionManager类:
  @Override
  protected RuntimeException translateException(String task, SQLException ex) {
    DataAccessException dae = getExceptionTranslator().translate(task, null, ex);
    if (dae != null) {
      return dae;
    }
    return super.translateException(task, ex);
  }


JdbcTemplate新增queryForStream()方法


这是5.3.0新增方法,这样就可以允许在可关闭的对象上进行惰性迭代,提高查询效率(不过JdbcTemplate貌似用得很少,至少国内是这样)。


@Transactional的timeout属性支持占位符取值


在这之前,@Transactional注解timeout属性的值只能写死,现在可以写成${...}从环境中动态取值了,方便许多且更富弹性。


Web升级


CORS跨域配置类

CorsConfiguration跨域配置类新增属性allowedOriginPatterns,用于通过通配符模式声明动态范围的域,之前只有allowedOrigins只能写死。


通过spring.xml.ignore属性可禁用xml解析模块

在Spring Boot大行其道的今天,面向元数据/注解编程成为了主流,基于xml配置的Spring应用越来越少。


为了加快启动速度和减少内存开销,Spring提供了spring.xml.ignore这个属性来禁用掉xml解析模块,如果你没有用到xml功能的话。同样的,我觉得这是Spring为云原生做的又一努力。


// 默认可以将.properties和xml配置加载到Properties类
PropertiesLoaderUtils:
  private static final boolean shouldIgnoreXml = SpringProperties.getFlag("spring.xml.ignore");
  public static void fillProperties(Properties props, Resource resource) throws IOException {
    ...
    if (filename != null && filename.endsWith(XML_FILE_EXTENSION)) {
      if (shouldIgnoreXml) {
        throw new UnsupportedOperationException("XML support disabled");
      }
      props.loadFromXML(is);
    }
    ...
  }
ConfigurationClassBeanDefinitionReader:
ResourcePropertiesPersister:


如果禁用了,不仅仅不会去加载xml文件,而且连相关的converters和codecs都不会去加载了。禁用方式为在类路径下的spring.properties文件里添加属性spring.xml.ignore = true即可。


Spring MVC提升


提升URL匹配效率


众所周知:Spring MVC中可以写Ant分隔的URL,也就是我们常用的@PathVariable,使用起来非常方便。但是,基于Ant风格的URL存在性能问题,特别实在高并发情况下尤为明显,不可忽视。


基于Ant风格的URL使用的AntPathMatcher进行匹配,Spring自己也知道它在高并发下存在着性能问题,在今年的早些时候官方也写了篇博客描述这个现象:URL Matching with PathPattern in Spring MVC


在5.3.0版本后,基于Ant风格的URL的匹配效率有了非常大的提升,具体原理和使用方式限于篇幅,将在后面文章用专文详解。


@ControllerAdvice可处理来自所有处理器的异常了


在过去@ControllerAdvice只能处理来自@Controller类型控制器的异常,但是我们知道Spirng MVC至少支持4种控制器类型,如HttpRequestHandler就是其中一种。从5.3.0版本开始就都可以用@ControllerAdvice来做拦截统一处理啦~


Spring WebFlux提升


  • 提供一个新类DefaultPartHttpMessageReader提供一个完全反应式的消息阅读器,它将缓冲区流转换为Flux<Part>
  • 提供一个新类PartHttpMessageWriter用于写Flux<Part>
  • 为Apache Http Components提供一个新的WebClient连接器


Testing测试提升


  • Spring的测试框架现在已基于JUnit Jupiter 5.7、JUnit 4.13.1、TestNG 7.3.0来构建(竟然还没放弃JUnit4.x,推荐信项目使用JUnit Jupiter 5.x哈,好用多了)
  • RestTemplate的客户端REST测试支持Multipart data


✍总结



总的来说,Spirng Framework这次的升级着力点主要在启动速度、性能使用上。作为5.x分支的最后一个功能分支,可圈可点,个人的升级建议是可以升也建议升。


当然,现在一般不会单独升级Spring Framework的版本,而是随着Spring Boot一起升级。截止稿前,Spirng Boot 2.4.0(基于Spring Framework 5.3.x)已正式发布,将会在下篇文章开启介绍,欢迎关注。

相关文章
|
6月前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
679 6
|
2月前
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
展望未来,随着5G、边缘计算等新技术的兴起,微服务架构的设计理念将会更加深入人心,Spring Cloud和Netflix OSS也将继续引领技术潮流,为企业带来更为高效、灵活且强大的解决方案。无论是对于初创公司还是大型企业而言,掌握这些前沿技术都将是在激烈市场竞争中脱颖而出的关键所在。
64 0
|
3月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
272 0
|
1月前
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
48 1
|
2月前
|
Kubernetes Cloud Native Java
当 Quarkus 遇上 Spring Boot,谁才是现代云原生应用的终极之选?究竟哪款能助你的应用傲视群雄?
Quarkus 和 Spring Boot 均为构建现代云原生应用的热门框架,旨在简化开发流程并提升性能。Spring Boot 依托庞大的 Spring 生态系统,提供开箱即用的体验,适合快速搭建应用。Quarkus 由红帽发起,专为 GraalVM 和 HotSpot 设计,强调性能优化和资源消耗最小化,是云原生环境的理想选择。
118 3
|
2月前
|
Cloud Native Java 对象存储
揭秘微服务架构之争:Spring Cloud与Netflix OSS巅峰对决,谁将称霸弹性云原生时代?
近年来,微服务架构成为企业应用的主流设计模式。本文对比了两大热门框架Spring Cloud和Netflix OSS,探讨其在构建弹性微服务方面的表现。Spring Cloud依托Spring Boot,提供全面的微服务解决方案,包括服务注册、配置管理和负载均衡等。Netflix OSS则由一系列可独立或组合使用的组件构成,如Eureka、Hystrix等。两者相比,Spring Cloud更易集成且功能完善,而Netflix OSS则需自行整合组件,但灵活性更高。实际上,两者也可结合使用以发挥各自优势。通过对两者的对比分析,希望为企业在微服务架构选型上提供参考。
53 0
|
3月前
|
安全 Java 网络安全
Spring Framework JDK >= 9 远程代码执行(CVE-2022-22965)
Spring Framework JDK >= 9 远程代码执行(CVE-2022-22965)
|
5月前
|
前端开发 Java 调度
Spring Webflux 是 Spring Framework 提供的响应式编程支持
Spring Webflux 是 Spring Framework 提供的响应式编程支持
79 2
|
4月前
|
Cloud Native Java 开发者
深入解析Spring Framework的核心设计原理
深入解析Spring Framework的核心设计原理
|
4月前
|
安全 Java Apache
如何安装与使用Spring Boot 2.2.x、Spring Framework 5.2.x与Apache Shiro 1.7进行高效开发
【7月更文第1天】在现代Java Web开发领域,Spring Boot以其简化配置、快速开发的特点备受青睐。结合Spring Framework的成熟与Apache Shiro的强大权限控制能力,我们可以轻松构建安全且高效的Web应用。本篇文章将指导你如何安装并使用Spring Boot 2.2.x、Spring Framework 5.2.x以及Apache Shiro 1.7来构建一个具备基础权限管理功能的项目。
80 0

热门文章

最新文章

下一篇
无影云桌面