概叙
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框架的各个版本发布时间轴如下:
-
Spring 1.0 - 2004.3.25 - 第一个正式版本
-
Spring 1.1 - 2005.6.15 - 显著的改进,包括控制反转(IoC)容器、AOP等
-
Spring 2.0 - 2006.10.23 - 引入了基于注解(annotation)的配置
-
Spring 2.5 - 2007.11.21 - 引入了表达式语言、MVC支持等
-
Spring 3.0 - 2009.12.16 - 引入了注解驱动的IoC和一些重要的新特性,如RestTemplate、caching、Java EE 5支持
-
Spring 4.0 - 2013.12.03 - 引入了全新的Java配置方式,包括Java based bean definition、websocket支持等
-
Spring 5.0 - 2017.09.28 - 支持Java 8特性,增加了重试机制、Spring WebFlux(反应式Web框架)等
-
Spring 5.1 - 2018.07.03 - 支持函数式编程风格,增加了对Kotlin的支持
-
Spring 5.2 - 2019.10.10 - 增加了对REST客户端的支持,如WebClient
-
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 从3.0 版本开始把一个项目拆分成多个项目。到目前的Spring Framework 6版本,共计分为20个子模块。
Test
对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试或TestNG, 简化测试环节.
Core Container
Spring的核心组件, 包含了Spring框架最基本的支撑.
- Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包.
- Core, 对应spring-core.jar, Spring核心jar包,很多基础核心类都在这个包中。
- Context, 对应spring-context.jar, Spring容器上下文对象.除了包含容器类型,很多第三方支持的内容都在这个模块中。
- Expression, 对应spring-expression.jar, Spring表达式语言.可以通过表达式快速获取容器内容。
- 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对数据访问层的封装
- JDBC, 对应spring-jdbc.jar. Spring对jdbc的封装, 当需要使用spring连接数据库时使用. spring-jdbc.jar需要依赖spring-tx.jar.
- Transactions, 对应spring-tx.jar. 事务管理。
- ORM, 对应spring-orm.jar. spring整合第三方orm框架需要使用的jar包, 例如Hibernate框架.
- OXM,对应spring-oxm.jar。spring对XML序列化实现,本质是对Marshalling XML的支持。
- R2DBC,对应spring-r2dbc.jar。对数据库响应式编程的支持。
- JMS,对应spring-jms.jar。Spring 提供对JMS的框架。
Web
Spring对javax下的接口或类做的扩展功能.
- web,对应spring-web.jar, Spring框架在Java Web项目使用时必须的包。
- webmvc,对应spring-webmvc.jar, 实际上就是SpringMVC框架.
- webflux,对应spring-webflux.jar,和Spring MVC类似,但是是目前比较流行的响应式编程。
- websocket,对应spring-websocket.jar。spring对websocket的支持。
Spring 6.0 的新特性
在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 对许多模块进行了优化,以提高性能、可扩展性和灵活性。下面是一些主要的优化:
-
Spring WebFlux:Spring Framework 6.0 引入了WebFlux 2.0,它是基于Reactor 3.4和Netty 4构建的响应式编程框架,可以实现更高的吞吐量和更低的延迟。
-
Spring Data:Spring Framework 6.0 对Spring Data模块进行了优化,使得它更容易与其他数据库和持久化技术集成,并且提供了更好的查询性能和更灵活的配置选项。
-
Spring Security:Spring Framework 6.0 对Spring Security模块进行了优化,使得它更容易扩展和自定义,并提供新的功能,例如支持OAuth 2.1和OpenID Connect 1.0等协议。
-
Spring Cloud:Spring Framework 6.0 在Spring Cloud模块中引入了一些重要的改进,包括更好的服务发现和负载均衡、更好的配置管理和监控、更好的微服务应用程序开发体验。
-
Spring Core:Spring Framework 6.0 对Spring Core模块进行了许多小的改进,例如对Java 17的支持、增强了AOP的性能、重构了BeanDefinition的结构等,从而提高了整个框架的性能和可维护性。
总之,Spring Framework 6.0 对许多模块进行了优化,以提高整个框架的性能、可扩展性和灵活性。
这使得开发者可以更轻松地构建云原生和微服务应用程序,并且更容易地集成到现有的软件生态系统中。
- 反应式编程支持:Spring 6.0对反应式编程提供了全面的支持,包括支持响应式Web框架、响应式数据存储和反应式安全。这些改进使得开发者能够更加方便地开发高并发、低延迟的应用程序。
- Kotlin支持:Spring 6.0对Kotlin提供了全面的支持,使得开发者可以使用Kotlin语言来开发Spring应用程序。Kotlin是一种静态类型编程语言,具有现代编程语言的特性,如空安全、数据类、函数式编程等。
- 函数式Web框架:Spring 6.0提供了一个全新的函数式Web框架,称为Spring WebFlux。这个框架是基于反应式编程的,提供了一种全新的方式来处理HTTP请求和响应。
- 增强的依赖注入:Spring 6.0对依赖注入进行了改进,提供了更灵活的方式来处理依赖注入。例如,开发者现在可以使用构造函数注入、setter注入和字段注入等多种方式来注入依赖。
- 改进的测试支持:Spring 6.0对测试支持进行了改进,提供了更多的注解和工具,以帮助开发者更方便地测试Spring应用程序。
- 安全性提升: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:
-
myService()
方法使用@Bean
注解标记,创建并返回一个MyService
的实例。 -
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的新特性示例
【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博客