科普文:Java基础spring系列之【spring6.0新特性】

276 篇文章 1 订阅
241 篇文章 1 订阅

概叙

Spring Framework前身是interface21,由Rod Johnson于2002年研发,主要是为了不使用EJB下依然能够构建高质量Java EE项目。EJB是当年横行一时的Java EE标准,但因为实现了JavaEE中所有标准,想要用里面的功能,是买一送二,不管用不用,反正都提供,属于“重量级”标准。EJB在互联网时代几乎已经不出现了(但是在一些工业项目中还有EJB的应用)。EJB当年在Java的地位和诺基亚手机当年在手机行业的地位是一样的,而Spring框架就是目前手机界的苹果,国内的华为。

随着技术的更替,可能十年后,又有新的技术把Spring给替代了。我们现在把Spring学好,将来会流行一句话:“来孩子,给你介绍一下。这位是当年Spring玩的贼6的老爷爷”

既然提到了Spring框架之父Rod Johnson(罗宾·约翰逊,悉尼大学计算机硕士,音乐博士),就必须要说一下他大力宣扬的《轮子理论》。《轮子理论》是Spring框架的宗旨,也是Spring框架能够被其他人能接受的原因。

轮子理论:不要重复的创造轮子。这里面的轮子就是汽车的轮子,告诉我们已经生产过的轮子就拿过来用,没必须重复生产多余的轮子。

轮子理论放在Spring框架上:我们Spring框架不发明新的技术,我们只是让已经有的技术,使用起来更加简单(整个Spring框架最重要的一句话,Spring框架的作用到底是干什么的)。乍一看这句话没问题,但细品能发现Rod Johnson是个纯老六。说Spring框架不发明新的技术,是告诉别的公司,我们不抢你们的生意,来用我,我还能让你们的技术用起来更加方便。但实际上

MVC框架:曾经Apache爆火的Struts1和Struts2都被Spring MVC给干掉了,近几年Spring 自己又出了WebFlux自己要干自己。

数据访问层框架:曾经的Hibernate目前被MyBatis干掉了。Spring 团队出了Spring Data 一直在和MyBatis竞争。

2014年Spring Boot出现后又开始自己干自己了,要取代掉Spring框架。话又说回来了,虽说不学Spring框架,直接学习Spring Boot也可以。但是学习完Spring框架可以很轻松的学会Spring Boot框架,所以一般都拿Spring 框架作为Spring Boot框架基础学,同时在部分公司的项目依然使用Spring框架,所以学习Spring框架的意义还是比较大的。

 

sping历史版本

Spring框架的各个版本发布时间轴如下:

  1. Spring 1.0 - 2004.3.25 - 第一个正式版本

  2. Spring 1.1 - 2005.6.15 - 显著的改进,包括控制反转(IoC)容器、AOP等

  3. Spring 2.0 - 2006.10.23 - 引入了基于注解(annotation)的配置

  4. Spring 2.5 - 2007.11.21 - 引入了表达式语言、MVC支持等

  5. Spring 3.0 - 2009.12.16 - 引入了注解驱动的IoC和一些重要的新特性,如RestTemplate、caching、Java EE 5支持

  6. Spring 4.0 - 2013.12.03 - 引入了全新的Java配置方式,包括Java based bean definition、websocket支持等

  7. Spring 5.0 - 2017.09.28 - 支持Java 8特性,增加了重试机制、Spring WebFlux(反应式Web框架)等

  8. Spring 5.1 - 2018.07.03 - 支持函数式编程风格,增加了对Kotlin的支持

  9. Spring 5.2 - 2019.10.10 - 增加了对REST客户端的支持,如WebClient

  10. Spring 6.0 - 2022.11 -1. 最低环境要求Java 17;2. 加强对响应式编程支持。添加子模块spring-r2dbc;3. 取消子模块spring-orm-hibernate;4,只保留spring-orm,只支持Hibernate5。

 

从Spring1. 到Spring5.x ,这里做下简单说为神马是1.x ,其实Spring的版本分为三个部分

第一部分就是主版本,就是我们看到的1~5

第二部分就是从版本,比如:1.0,1.1包括2.0,2.5这样的版本,主要针对主版本多一些简单的更新

第三部分就是次要版本,比如:1.0.1 主要是一个Bug Fix 或者是部分上面的提升从上面可以看出Java 版本分为 Java标准版本和Java 企业版本;从Java5做了分水岭,Java5之前标准版本叫J2SE就是Java 2后面Standrad E这个版本,

另外一个就是Java企业版本,从Java EE 之前叫 J2EE,包括1.0到1.4的版本

Spring 1.x

Spring Framework 1.x 版本,支持Java 1.3 ,那么为什么会到Java1.3。

其实非常有道理,因为Spring Framework 早起版本叫 interface21,当时这个版本依赖于java1.3,1.3引入一个重要概念是是什么-动态代理,从Java1.3开始就会针对接口的方式进行动态处理,这里实现AOP的一个重要环节,因此Spring的第一个版本就必须依赖于Java1.3,AOP也就是Spring Framework 的一个重要部分,于此同时它支持的Java EE版本也是1.3,这个版本的一个简单特性就是Servlet的API就是Java版本的是1.3,Servlet是2.3这个版本,2.3这个版本支持Servlet事件,那么因此它可以和我们的Spring里面的事件进行一个呼应,当然Servlet事件和Java事件都是Java标准事件的实现

Spring 2.x

其实这个版本在一些老的项目里面比较容易常见,比如Spring Framework2.5.6这个版本,还包括Spring Framework 2.5.6 ESC这样的版本,那就是Security的缩写,那就是针对安全部分做重新上面的设计和一些提升,它依赖Java的标准版本是Java1.4.2,这个版本支持包括我们常说的NIO的支持此时,J2EE版本并没有做太多的更新还是支持到J2EE 1.3版本

Spring 3.x

Spring 3.x 是一个重大版本,那么Spring从3这个版本开始引入了大量的注解,所以它所需要支持的Java5这个版本,在Java5里面会提升到一些注解,包括注解&枚举这些,所以在Spring3里面会引入大量的注解&枚举,所以这个时候对Java 版本的最低要求就是java5,对应J2EE 1.4版本和J2EE1.5版本,Spring 3.x 为什么是一个重要版本,因为Spring3.x 基本确定了Spring Framework的内核,这个内核比较多,包括注解驱动,事件驱动包括一些AOP的支持,它在这个版本做的都比较完善

Spring 4.x

Spring 4.x 这个版本主要是对Spring3.x版本增加了一些新的东西,主要是一些细节上的东西,包括注解上面的提升,对Java支持只需要Java6版本以上就行,这就是为了照顾到更多的人去使用Spring Framework 4这个版本,那么于此同时从Spring Framework 4 开始也是对Sping Boot 1.x 的支持;也就是说Spring Boot 1.x 版本也是基础Spring 4进行开发的,Spring Boot 2是基础Spring 5来开发的

Spring 5.x

Spring Boot 2是基础Spring 5来开发的,从Spring 4开始 Spring 就慢慢摆脱J2EE 的局限性形成自己的体系包括后面延伸出来的Spring Boot & Spring Cloud

Spring 5.x和6.x版本支持时间

Spring 6.0 的组成模块

参考官网:

Spring Framework Documentation :: Spring Framework

Spring | Quickstart

Spring Framework 6.0 goes GA


Spring 从3.0 版本开始把一个项目拆分成多个项目。到目前的Spring Framework 6版本,共计分为20个子模块。

Test

对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试或TestNG, 简化测试环节.

Core Container

Spring的核心组件, 包含了Spring框架最基本的支撑.

  1. Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包.
  2. Core, 对应spring-core.jar, Spring核心jar包,很多基础核心类都在这个包中。
  3. Context, 对应spring-context.jar, Spring容器上下文对象.除了包含容器类型,很多第三方支持的内容都在这个模块中。
  4. Expression, 对应spring-expression.jar, Spring表达式语言.可以通过表达式快速获取容器内容。
  5. JCL,对应spring-jcl.jar。Spring日志,从spring老版本要求使用commons-logging.jar,从spring 5.x开始,自己对commons-logging做了封装。

AOP

面向切面编程, 对应spring-aop.jar.

Aspects

AspectJ的具体实现,面向切面编程的另一种实现。对应spring-aspects.jar

Instrumentation

服务器代理接口的具体实现。对应spring-instrument.jar

Messaging

集成messaging api和消息协议提供支持。对应spring-messaging.jar

Data Access/Integration

Spring对数据访问层的封装

  1. JDBC, 对应spring-jdbc.jar. Spring对jdbc的封装, 当需要使用spring连接数据库时使用. spring-jdbc.jar需要依赖spring-tx.jar.
  2. Transactions, 对应spring-tx.jar. 事务管理。
  3. ORM, 对应spring-orm.jar. spring整合第三方orm框架需要使用的jar包, 例如Hibernate框架.
  4. OXM,对应spring-oxm.jar。spring对XML序列化实现,本质是对Marshalling XML的支持。
  5. R2DBC,对应spring-r2dbc.jar。对数据库响应式编程的支持。
  6. JMS,对应spring-jms.jar。Spring 提供对JMS的框架。

Web

Spring对javax下的接口或类做的扩展功能.

  1. web,对应spring-web.jar, Spring框架在Java Web项目使用时必须的包。
  2. webmvc,对应spring-webmvc.jar, 实际上就是SpringMVC框架.
  3. webflux,对应spring-webflux.jar,和Spring MVC类似,但是是目前比较流行的响应式编程。
  4. websocket,对应spring-websocket.jar。spring对websocket的支持。

Spring 6.0 的新特性

Spring Framework 6.0 goes GA

在2022年11月16日,Juergen Hoeller发布了消息,称 Spring Framework 6将正式发布。

Spring 6 是一个重要的版本,距离 Spring 5 发布有四年多了。

JDK 17+和Jakarta EE 9+基线

  • 现在基于Java 17源代码级别的整个框架代码库。
  • Servlet、JPA等从javax迁移到Jakarta 命名空间。
  • 运行时与Jakarta EE 9以及Jakarta EE 10 API的兼容性。
  • 与最新的Web服务器兼容:Tomcat 10.1,Jetty 11,Undertow 2.3.
  • 早期兼容虚拟线程(从JDK 19开始预览)。
  • 降低Spring Boot对Spring Framework的依赖:Spring Framework 6.0 修改了Spring Boot中的一些代码,使得它对Spring Framework的依赖降低到最小限度。

一般核心修订

  • 升级到ASM 9.4和Kotlin 1.7。
  • 完整的CGLIB fork,支持捕获CGLIB生成的类。
  • 全面的向AOT(Ahead-Of-Time Processing,提前处理)转型。
  • 对GraalVM原生映像的一流支持。

核心容器

  • 默认情况下,无需java.beans.Introspector来确定基本bean属性。
  • 在GenericApplicationContext (refreshForAotProcessing)中的支持AOT处理。
  • 基于预解析构造函数和工厂方法的Bean定义转换。
  • 支持AOP代理和配置类的早期代理类确定。
  • PathMatchingResourcePatternResolver使用NIO和模块路径API进行扫描,分别支持GraalVM本机映像和Java模块路径中的类路径扫描。
  • DefaultFormattingConversionService支持基于ISO的默认java.time类型解析。
  • 自动模块化:Spring Framework 6.0 增加了对Java 9+特性的支持,从而使得应用程序更容易迁移到模块化机制。

  • 编译时注解处理器:Spring Framework 6.0 包含了一个新的编译时注解处理器(Annotation Processor),可帮助开发者在编写代码时提供更好的IDE支持和编译时检查。

数据访问和事务

  • 支持预定JPA托管类型(用于包含在AOT处理中)。
  • JPA支持Hibernate ORM 6.1(保持与Hibernate ORM 5.6的兼容性)。
  • 升级到R2DBC 1.0(包括R2DBC事务定义)。
  • 删除JCA CCI支持。

Spring消息传递

  • 基于@RSocketExchange服务接口的RSocket接口客户端。
  • 基于Netty 5 Alpha的Reactor Netty 2的早期支持。
  • 支持Jakarta WebSocket 2.1及其标准WebSocket协议升级机制。

通用Web修订

  • 基于@HttpExchange服务接口的HTTP接口客户端。
  • 支持RFC 7807问题详细信息.
  • 统一HTTP状态码处理。
  • 支持Jackson 2.14。
  • 与Servlet 6.0对齐(同时保留与Servlet 5.0的运行时兼容性)。

Spring MVC

  • 默认情况下使用的PathPatternParser(能够选择进入PathMatcher)。
  • 删除过时的Tiles和FreeMarker JSP支持。

Spring WebFlux

  • 新的PartEvent API用于流式传输多部分表单上传(两者都在客户端和服务器).
  • 新的ResponseEntityExceptionHandler用于自定义WebFlux异常并呈现RFC 7807错误响应.
  • 非流媒体类型的Flux返回值(写入前不再收集到List)。
  • 基于Netty 5 Alpha的Reactor Netty 2的早期支持。
  • JDK HttpClient与WebClient集成。

可观察性

  • Micrometer Observation直接可观察性在Spring框架中的部分应用。spring-web模块现在需要io.micrometer:micrometer-observation:1.10+作为编译依赖项。
  • RestTemplate和WebClient被检测为生成HTTP客户端请求观察。
  • Spring MVC可以使用新的org.springframework.web.filter.ServerHttpObservationFilter检测HTTP服务器观察。
  • Spring WebFlux可以使用新的org.springframework.web.filter.reactive.ServerHttpObservationFilter检测HTTP服务器观察。
  • 对于Flux和Mono的Micrometer Context Propagation集成,从控制器方法返回值。

测试

  • 支持在JVM上或GraalVM本机映像中测试AOT处理的应用程序上下文。
  • 集成HtmlUnit 2.64 +请求参数处理。
  • Servlet模拟(MockHttpServletRequest、MockHttpSession)现在基于Servlet API 6.0。

 

Spring6.0 对哪些模块进行了优化

Spring Framework 6.0 对许多模块进行了优化,以提高性能、可扩展性和灵活性。下面是一些主要的优化:

  1. Spring WebFlux:Spring Framework 6.0 引入了WebFlux 2.0,它是基于Reactor 3.4和Netty 4构建的响应式编程框架,可以实现更高的吞吐量和更低的延迟。

  2. Spring Data:Spring Framework 6.0 对Spring Data模块进行了优化,使得它更容易与其他数据库和持久化技术集成,并且提供了更好的查询性能和更灵活的配置选项。

  3. Spring Security:Spring Framework 6.0 对Spring Security模块进行了优化,使得它更容易扩展和自定义,并提供新的功能,例如支持OAuth 2.1和OpenID Connect 1.0等协议。

  4. Spring Cloud:Spring Framework 6.0 在Spring Cloud模块中引入了一些重要的改进,包括更好的服务发现和负载均衡、更好的配置管理和监控、更好的微服务应用程序开发体验。

  5. Spring Core:Spring Framework 6.0 对Spring Core模块进行了许多小的改进,例如对Java 17的支持、增强了AOP的性能、重构了BeanDefinition的结构等,从而提高了整个框架的性能和可维护性。

总之,Spring Framework 6.0 对许多模块进行了优化,以提高整个框架的性能、可扩展性和灵活性。

这使得开发者可以更轻松地构建云原生和微服务应用程序,并且更容易地集成到现有的软件生态系统中。

  1. 反应式编程支持:Spring 6.0对反应式编程提供了全面的支持,包括支持响应式Web框架、响应式数据存储和反应式安全。这些改进使得开发者能够更加方便地开发高并发、低延迟的应用程序。
  2. Kotlin支持:Spring 6.0对Kotlin提供了全面的支持,使得开发者可以使用Kotlin语言来开发Spring应用程序。Kotlin是一种静态类型编程语言,具有现代编程语言的特性,如空安全、数据类、函数式编程等。
  3. 函数式Web框架:Spring 6.0提供了一个全新的函数式Web框架,称为Spring WebFlux。这个框架是基于反应式编程的,提供了一种全新的方式来处理HTTP请求和响应。
  4. 增强的依赖注入:Spring 6.0对依赖注入进行了改进,提供了更灵活的方式来处理依赖注入。例如,开发者现在可以使用构造函数注入、setter注入和字段注入等多种方式来注入依赖。
  5. 改进的测试支持:Spring 6.0对测试支持进行了改进,提供了更多的注解和工具,以帮助开发者更方便地测试Spring应用程序。
  6. 安全性提升:Spring 6.0对安全性进行了改进,提供了更多的安全特性和功能,以帮助开发者开发出更安全的应用程序。

总之,Spring 6.0是一个重要的版本,它提供了许多新特性和改进,以帮助开发者更高效地完成工作。

然而,需要注意的是,Spring 6.0需要Java 17或更高版本,因此,在升级到Spring 6.0之前,请确保您的项目已经升级到支持的Java版本。

Spring Framework 6.0代码示例

以下是一个简单的Spring Framework 6.0的Java代码示例,展示了如何使用该框架进行依赖注入和Bean配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
   
   

    @Bean
    public MyService myService() {
   
   
        return new MyServiceImpl();
    }

    @Bean
    public MyController myController(MyService myService) {
   
   
        return new MyController(myService);
    }
}

上述代码演示了一个简单的配置类 AppConfig,使用 @Configuration 注解标记该类为Spring配置类。其中定义了两个Bean:

  1. myService() 方法使用 @Bean 注解标记,创建并返回一个 MyService 的实例。

  2. myController(MyService myService) 方法使用 @Bean 注解标记,创建并返回一个 MyController 的实例,并通过构造函数注入了 MyService

下面是相应的Service和Controller的示例:

public interface MyService {
   
   
    void doSomething();
}

public class MyServiceImpl implements MyService {
   
   
    @Override
    public void doSomething() {
   
   
        System.out.println("Doing something...");
    }
}

public class MyController {
   
   
    private final MyService myService;

    public MyController(MyService myService) {
   
   
        this.myService = myService;
    }

    public void handleRequest() {
   
   
        myService.doSomething();
    }
}

在这个示例中,MyService 是一个接口,MyServiceImpl 是其具体实现类。MyController 使用构造函数注入 MyService 实例,并在 handleRequest() 方法中调用 MyService 的方法。

通过上述代码示例,可以看到Spring Framework 6.0的基本用法,包括使用注解进行配置、依赖注入和创建Bean实例。这只是一个简单的示例,实际应用中可能涉及更多的类和组件。

在实际应用中,如何使用Spring6呢?

首先,需要将JDK版本升级到17+,以确保与Spring6的兼容性。

其次,需要选择合适的Jakarta EE容器作为应用服务器,如Tomcat 10或Jetty 11。

然后,可以开始使用Spring6的核心模块进行开发。通过使用Beans、BeanFactory和BeanDefinitons、ApplicationContext等核心概念,可以方便地实现依赖注入、配置管理和应用上下文等功能。此外,还可以利用Spring6新增的功能,如AOP AOT(静态编译)等,来提高应用的性能和可维护性。
总之,Spring6作为一款引领Java开发新时代的开源框架,提供了许多强大的新特性和性能改进。

Spring 6的新特性示例

Spring6.0新特性详解-CSDN博客

详解spring6.0新特性汇总-CSDN博客

Spring 6(三)-CSDN博客

【Spring面试全家桶】Spring之6.0核心新特性介绍_spring6.0新特性-CSDN博客

1. 模块化微服务支持

Spring 6将进一步提升对微服务的支持。它将引入更多的模块化特性,使开发人员能够更轻松地构建和部署微服务应用。这将包括更好的容器化支持、服务注册与发现、集成Kubernetes等功能。

// 示例代码:Spring 6的微服务模块化配置
@Configuration
@EnableMicroservices
public class MyMicroserviceConfig {
    // 配置微服务相关参数
}

2. 响应式编程进一步增强

响应式编程已经成为现代应用程序的一部分,Spring 6将进一步增强对响应式编程的支持。它将包括更多的反应式操作符、性能优化以及更好的响应式数据库集成。

// 示例代码:Spring 6的响应式编程示例
Flux<String> dataStream = myService.getDataStream();
dataStream
    .filter(data -> data.contains("Spring"))
    .subscribe(data -> System.out.println("Received: " + data));

3. Kotlin原生支持

Kotlin已经成为Java生态系统中备受欢迎的语言之一。Spring 6将提供更多的Kotlin原生支持,包括更友好的Kotlin DSL、Kotlin扩展和更好的互操作性。

// 示例代码:Spring 6中的Kotlin DSL
@Bean
fun myRouter() = coRouter {
    GET("/hello") { ok().bodyValue("Hello, Kotlin!") }
}

4. AOT的支持(基于Graalvm)

AOT 编译能直接将源代码转化为机器码,内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化,AOT 缺点就是在程序运行前编译会使程序安装的时间增加。

关于AOT和JDK原生的JIT之间的关系和区别,后面再详细说明,暂不展开。

关于GraalVM可以参考之前的文章:

科普文:GraalVM简介_java graal vm-CSDN博客

科普文:OpenJDK vs. GraalVM vs. Amazon Corretto性能测试_graalvm性能对比-CSDN博客

科普文:主流JDK性能大比拼;Zulu OpenJDK/OpenJDK/Oracle JDK/GraalVM CE-CSDN博客

科普文:【方向盘】OpenJDK生态圈_8u211以下版本(比如jdk 8u210-CSDN博客 

科普文:Oracle JDK收费后的常见openJDK版本梳理-CSDN博客 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-无-为-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值