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的主要类和接口包括:
- javax.annotation.processing.Processor:这是一个注解处理器的接口,定义了注解处理器的基本行为和方法。开发人员需要实现这个接口来创建自定义的注解处理器。
- javax.annotation.processing.AbstractProcessor:这是Processor接口的一个抽象实现,提供了一些默认的方法和辅助工具,简化了注解处理器的实现。
- 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 的意义体现在以下几个方面:
- 兼容性:通过适配器,CompletableFuture 对象可以转换为 ListenableFuture 对象,使得使用 Spring 框架的代码可以与使用 CompletableFuture 的代码进行兼容。这样,不需要修改现有的 CompletableFuture 代码,就可以在 Spring 的异步环境中使用它们。
- 互操作性:使用适配器,可以在 Spring 框架中使用 CompletableFuture 对象。这使得可以在 Spring 的异步操作中利用 CompletableFuture 提供的丰富方法,例如使用 thenApply 进行流水线操作、使用 thenCompose 进行组合操作等。同时,也可以在使用 CompletableFuture 的代码中与 Spring 的异步特性进行协作,例如将 CompletableFuture 对象传递给使用 ListenableFuture 的方法。
- 扩展性:适配器的存在使得 Spring 框架可以更容易地与未来的 Java 异步编程模型进行集成。如果未来出现了新的异步编程工具,可以通过创建适当的适配器来使其与 Spring 的 ListenableFuture 进行兼容。
感谢您读到这里,不胜感激。
如果您对笔者其他文章感兴趣,可以扫一扫关注笔者的公众号:种颗代码技术树
公众号文章更新更及时,以及一些程序员周边相关更新。