Spring版本与JDK版本演变

Java各版本变更核心API

Java8

  • lambada表达式
  • 函数式接口
  • 方法引用
  • 默认方法
  • Stream API 对元素流进行函数式操作
  • Optional 解决NullPointerException
  • Date Time API
  • 重复注解 @Repeatable
  • Base64
  • 使用元空间Metaspace代替持久代(PermGen space)

Java7

  • switch 支持String字符串类型
  • try-with-resources,资源自动关闭
  • 整数类型能够用二进制来表示
  • 数字常量支持下划线
  • 泛型实例化类型自动推断,即”<>”
  • catch捕获多个异常类型,用(|)分隔开
  • 全新的NIO2.0 API
  • Fork/join 并行执行任务的框架

Java6

  • java.awt新增Desktop类和SystemTray类
  • 使用JAXB2来实现对象与XML之间的映射
  • 轻量级 Http Server API
  • 插入式注解处理API(lombok使用该特性来实现的)
  • STAX,处理XML文档的API
  • Compiler API
  • 对脚本语言的支持(ruby, groovy, javascript)

Java 5

  • 泛型(本质是参数化类型,解决不确定具体对象类型的问题)
  • 增强的for循环(for-each)
  • 自动装箱和自动拆箱(包装类型有:Integer,Double,Float,Long,Short,Character和Boolean)
  • 类型安全的枚举(enum)
  • 可变长度参数
  • 静态引入(import static)
  • 元数据(注解)
  • 线程并发库(java.util.concurrent)

java1.4(2004)

  • XML解析器
  • Java打印服务
  • Logging API(日志功能)
  • Java Web Start
  • JDBC 3.0 API(jdbc高级)
  • 断言
  • Preferences API
  • 链式异常处理
  • 支持IPV6
  • 支持正则表达式
  • 引入Imgae I/O API (图片流);
  • NIO(高级流)
  • XSLT转换器

java1.3 (2000)

  • Timer API(时间)
  • Java Sound API(声音)
  • RMI通信协议
  • jar文件索引
  • 优化和增强

java1.2 (1998)

  • J2SE/J2EE/J2ME
  • EJB
  • Java IDL(平台对象请求代理体系结构)
  • 集合框架
  • JIT(Just In Time)编译器
  • 数字签名
  • JFC(Java Foundation Classes), 包括Swing1.0, 拖放和Java2D类库
  • Java Plug-In(运行插件)
  • JDBC中引入可滚动结果集,BLOB,CLOB,批量更新和用户自定义类型
  • Applet中添加声音支持
  • 字符串常量做内存映射
  • 控制授权/访问系统资源的策略工具

java1.1 (1997)

  • JAR
  • JDBC
  • JavaBean
  • RMI(远程调用)
  • Inner Class(内部类)
  • Reflection(反射)

Spring对JDK API的实践

小于Java 5 API

反射

JDK 1.1中引入反射机制。Spring Framework 1.0+版本对JDK要求是1.3以上,因此,Spring 1.0中肯定可以使用到JDK 1.1的反射特性,代表实现是MethodMatcher。

动态代理

JDK 1.3中引入动态代理,Spring Framework 1.0+中的代表实现是JdkDynamicAopProxy。

JDK 5

XML

JDK 5版本引入XML处理(DOM、SAX),在Spring中的代表实现是XmlBeanDefinitionReader,其作用是:读取xml配置文件中的信息读取为BeanDefinition。

BeanDefinition描述了Spring容器中的Bean的配置元数据,定义了如何创建、配置和管理Bean的信息,包括Bean的类名、作用域、属性值、构造函数参数、依赖关系等。

Instrumentation
Java语言提供的一个API,它允许开发人员在运行时修改、转换和监控Java应用程序的字节码。Instrumentation API通常与Java代理技术(如字节码增强或动态代理)结合使用,用于实现各种功能和行为的增强。

Spring Agent是Spring框架提供的一个Java代理技术,用于增强应用程序的功能和行为。它通过字节码操纵技术,在应用程序运行时动态地修改和增强类的行为。

在Spring中,使用Instrumentation的典型实现是:InstrumentationSavingAgent,其功能是把Instrumentation的功能存储到本地,实现字节码的增强,Spring中的各种Agent实现都是基于JDK的Instrumentation。

J.U.C

J.U.C即 package java.util.concurrent,是Java提供的并发框架包。在Spring 3.0版本后提供了ThreadPoolTaskScheduler实现。它是Spring提供的一个任务调度器,用于在后台线程池中执行定时任务和异步任务。它是基于线程池的调度器,可以提供可靠的任务执行和调度管理。

Formatter

实现国际化,不同格式时间类型转换。

JDK 6

JDBC 4.0

Java 6中引入JDBC 4.0规范,代表实现是JdbcTemplate。

Java Compiler API

Java Compiler API是Java语言提供的一组API,允许开发人员在运行时动态地编译和执行Java源代码。它提供了一种在Java应用程序中编译Java源代码的方式,从而实现动态代码生成、扩展和增量编译等功能。

在Spring 5.0后,单元测试TestCompiler间接使用了Java Compiler API,以实现在测试中动态编译和加载类。

可插拔注解处理器API

可插拔处理器允许开发人员编写自定义的注解处理器,用于在编译时处理和操作注解信息。

可插拔注解处理器API的主要类和接口包括:

  1. javax.annotation.processing.Processor:这是一个注解处理器的接口,定义了注解处理器的基本行为和方法。开发人员需要实现这个接口来创建自定义的注解处理器。
  2. javax.annotation.processing.AbstractProcessor:这是Processor接口的一个抽象实现,提供了一些默认的方法和辅助工具,简化了注解处理器的实现。
  3. javax.annotation.processing.RoundEnvironment:这个接口提供了当前编译轮次(Round)的环境信息,包括可以处理的注解和对应的元素(Element)。

JDK 7

Fork/Join

Fork/Join是JDK 7提出的新特性,在Spring 3.1开始使用Fork/Join的新特性,其代表实现就是ForkJoinPoolFactoryBean。

ForkJoinPoolFactoryBean的主要作用是:创建ForkJoinPool实例,并对其进行配置线程池参数,如:并行级别、线程工厂、线程命名前缀等,还可以对ForkJoinPool进行全生命周期的管理和控制。

NIO 2

NIO 2(New I/O 2)是 Java 提供的一种用于非阻塞 I/O 操作的新的 I/O API。它是 Java NIO(New I/O)的改进版本,引入了许多新的功能和改进,旨在提高 I/O 操作的效率和可扩展性。

在Spring 4.0后出现的PathResource典型实现,PathResource 是 Spring Framework 中的一个资源实现类,用于表示基于文件系统路径的资源(文件和路径分开)。它实现了 Resource 接口,提供了对文件系统路径资源的访问和操作。

JDK 8

Date And Time API

Date And Time API,是JDK 8引入新的日期和时间API,也称为JDK 8引入了新的日期和时间API,也称为Java 8 Date and Time API或java.time包。这个API提供了更加全面、易于使用和线程安全的日期和时间处理功能,相比于旧的java.util.Date和java.util.Calendar(since 1.1)类,它提供了更多的灵活性和功能。

在Spring 4.0后基于Date And Time API实现的是:DateTimeContext,它提供了动态切换时间上下文功能,用于更灵活的处理日期和时间的操作。

可重复 Annotations

在 JDK 8 中,引入了可重复注解(Repeatable Annotations)的功能。这个功能允许在同一个元素上多次使用相同的注解类型,以前的注解使用方式只能在一个元素上使用一次。

在使用可重复注解之前,如果我们想在同一个元素上应用多个相同类型的注解,我们需要将这些注解放在一个容器注解(Container Annotation)中。例如:

@ContainerAnnotation({
    @MyAnnotation("value1"),
    @MyAnnotation("value2")
})
public class MyClass {
    // Class body
}

上述代码中,我们使用了一个容器注解 @ContainerAnnotation 来包含多个相同类型的注解 @MyAnnotation。

使用可重复注解之后,我们可以直接在同一个元素上多次使用相同的注解类型,而不需要额外的容器注解。例如:

@MyAnnotation("value1")
@MyAnnotation("value2")
public class MyClass {
    // Class body
}

在Spring 4.0后,@PropertySources用于指示 Spring 应用程序加载多个属性源(property sources)。它通常与 @PropertySource 注解一起使用,用于指定要加载的属性源文件。@PropertySources 注解的作用是将多个 @PropertySource 注解组合在一起,以便一次性加载多个属性源文件。这样可以方便地将应用程序的配置信息分散在多个属性文件中,而不是集中在一个文件中。

@Configuration
@PropertySources({
    @PropertySource("classpath:config/app.properties"),
    @PropertySource("file:/etc/myapp/config.properties")
})
public class AppConfig {
    // Configuration beans and other definitions
}

Stream

JDK 8版本新特性中,Stream流和函数式接口可能是最大的变更特征。在Spring 4.2版本后,提供了StreamConverter的实现,其作用是将一个类型的流转为另一个类型的流。

public class StreamConverterExample {
    public static void main(String[] args) {
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        convert(integerStream, Object::toString).forEach(System.out::println);
    }

    public static <T, R> Stream<R> convert(Stream<T> stream, StreamConverter<T, R> converter) {
        return stream.map(converter::convert);
    }


    @FunctionalInterface
    interface StreamConverter<T, R> {
        R convert(T input);
    }
}
CompletableFuture

CompletableFuture是J.U.C包提供的一个多线程异步操作类,如将耗时操作放入线程池中异步执行,而不会阻塞主线程,以提高程序的并发性和响应性。

适配器设计模式:适配器设计模式的主要作用是使不兼容的接口能够协同工作。它允许将一个类的接口转换为另一个类所期望的接口,从而使这两个类能够协调合作,无需修改其原始代码。

在Spring 4.2 CompletableToListenableFutureAdapter 的主要意义在于提供了一个桥梁,使得在使用 Spring 框架的异步特性时能够与使用 Java 8 的 CompletableFuture 的代码进行兼容和协作。

CompletableToListenableFutureAdapter 的主要意义在于提供了一个桥梁,使得在使用 Spring 框架的异步特性时能够与使用 Java 8 的 CompletableFuture 的代码进行兼容和协作。

CompletableToListenableFutureAdapter 的意义体现在以下几个方面:

  1. 兼容性:通过适配器,CompletableFuture 对象可以转换为 ListenableFuture 对象,使得使用 Spring 框架的代码可以与使用 CompletableFuture 的代码进行兼容。这样,不需要修改现有的 CompletableFuture 代码,就可以在 Spring 的异步环境中使用它们。
  2. 互操作性:使用适配器,可以在 Spring 框架中使用 CompletableFuture 对象。这使得可以在 Spring 的异步操作中利用 CompletableFuture 提供的丰富方法,例如使用 thenApply 进行流水线操作、使用 thenCompose 进行组合操作等。同时,也可以在使用 CompletableFuture 的代码中与 Spring 的异步特性进行协作,例如将 CompletableFuture 对象传递给使用 ListenableFuture 的方法。
  3. 扩展性:适配器的存在使得 Spring 框架可以更容易地与未来的 Java 异步编程模型进行集成。如果未来出现了新的异步编程工具,可以通过创建适当的适配器来使其与 Spring 的 ListenableFuture 进行兼容。

感谢您读到这里,不胜感激。

如果您对笔者其他文章感兴趣,可以扫一扫关注笔者的公众号:种颗代码技术树

公众号文章更新更及时,以及一些程序员周边相关更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/99458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day3 c++d对话框及事件处理机制

1.文本编辑器 2.自由移动的球

手把手教你写出第一个C语言程序

Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…

QT DAY4

一、对话框 消息对话框、字体对话框、颜色对话框、文件对话框 1.1消息对话框 主要分为这四类对话及一种NoIcon无图标对话 而对话框也分为两种实现方式&#xff0c;一种为基于属性分开初始化的方式&#xff0c;这种方式更灵活&#xff0c;更多元&#xff0c;需要对exec的返回值…

SQLPro Studio for Mac:强大的SQL开发和管理工具

SQLPro Studio for Mac是一款强大的Mac上使用的SQL开发和管理工具&#xff0c;它支持各种数据库&#xff0c;包括MySQL&#xff0c;PostgreSQL&#xff0c;SQLite等。使用 SQLPro Studio&#xff0c;您可以轻松地连接和管理您的数据库&#xff0c;执行SQL查询和脚本&#xff0c…

c++11 标准模板(STL)(std::basic_ostringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

Windows安装Nginx及部署vue前端项目操作

先在nginx官网下载windows下安装的包&#xff0c;并解压&#xff0c;到ngnix目录下 双击nginx.exe,会有黑窗闪过。 用cmd命令窗口&#xff0c;cd 到nginx解压目录&#xff0c;./nginx启动。 在浏览器中访问http://localhost:80,出现以下界面说明启动成功(由于笔者电脑80端口被…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Nano编辑器安装使用指南

关于nano Nano编辑器是一个命令行文本编辑器&#xff0c;具有简单易用的界面和一些基本功能。 Nano小巧友好&#xff0c;提供许多额外的特性&#xff0c;例如交互式的查找和替换、定位到指定的行列、自动缩进、特性切换、国际化支持、文件名标记完成等。 Nano是为了代替闭源的…

【0901作业】QTday3 对话框、发布软件、事件处理机制,使用文件相关操作完成记事本的保存功能、处理键盘事件完成圆形的移动

目录 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 2.2 处理键盘事件完成圆形的移动 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 void Widget::on_saveBtn_clicked() {QString filename QFileDialog::getSaveFileName(this,&…

DVWA失效的访问控制

失效的访问控制&#xff0c;可以认为是系统对一些功能进行了访问或权限限制&#xff0c;但因为种种原因&#xff0c;限制并没有生效&#xff0c;造成失效的访问控制漏洞,比如越权等 这里以DVWA为例&#xff0c;先访问低难度的命令执行并抓包 删除cookie&#xff0c;并在请求头…

堆的基本存储(Java 实例代码)

堆的基本存储 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。 二、适用说明 堆是利用完…

【防火墙】防火墙NAT Server的配置

Web举例&#xff1a;公网用户通过NAT Server访问内部服务器 介绍公网用户通过NAT Server访问内部服务器的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网Web服务器和FTP服务器能够对外提供服务&#xff0c;需要在FW上配置NAT Server功能。除了公网…

java八股文面试[多线程]——进程与线程的区别

定义 1、进程&#xff1a;进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位&#xff0c;也是基本的执行单元。是一个动态的概念&#xff0c;是一个活动的实体。它不只是程序的代码&#xff0c;还包括当前的活动。 进程结构…

RunnerGo:提升性能测试效率的强大利器

在现代软件开发中&#xff0c;性能测试是确保应用程序在真实负载下正常运行的关键环节。为了满足不断增长的用户需求和保证应用程序的性能稳定性&#xff0c;这里给大家介绍RunnerGo&#xff0c;这是一款功能强大、易于使用的性能测试平台&#xff0c;能够极大地提升性能测试的…

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1&#xff09;、A--原子性 …

9、Spring_事务管理

六、Spring 事务管理 1.Spring 事务简介 事务概述&#xff1a;保证数据库操作同时成功或者同时失败 Spring 事务的概述&#xff1a;在数据层保证数据库操作同时成功或者同时失败 2.转账案例分析 转账肯定有一个业务方法&#xff1a;给转出用户减钱&#xff0c;给转入用户加…

Linux枚举文件目录、获取文件属性

目录 1.枚举指定路径下的文件目录2.获取文件属性stat其他方式&#xff1a;Linux获取文件属性stat()、fstat()、lstat()函数实现stat属性代码 1.枚举指定路径下的文件目录 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.…

Python基础学习第六天:Python 数据类型

内置数据类型 在编程中&#xff0c;数据类型是一个重要的概念。 变量可以存储不同类型的数据&#xff0c;并且不同类型可以执行不同的操作。 在这些类别中&#xff0c;Python 默认拥有以下内置数据类型&#xff1a; 获取数据类型 您可以使用 type() 函数获取任何对象的数据…

IDEA使用git

文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge

Linux中的进程、fork、进程状态、环境变量

1、进程 1.1 PCB 进程信息被放在一个叫做进程控制块的数据结构中&#xff0c;可以理解为进程属性的集合。课本上称之为PCB&#xff08;process control block&#xff09;&#xff0c;Linux操作系统下的PCB是: task_struct 在Linux中描述进程的结构体叫做task_struct。task_s…