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 进行兼容。

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值