spring-core-1-08 | JDK API实践:Spring怎样取舍Java I/O、集合、反射、动态代理等API的使用?

JDK 核心API

在这里插入图片描述

以上的核心API也是工作中对于java常用的, 有必要了解.

< Java 5

主要罗列的是 Java 1.2 之后的 API,
反射是从 Java 1.2 以后开始引入的, 其实就是 Java Beans, 在spring中的引用非常广泛.
动态代理也是 spring 1.0 开始 就必须依赖的东西, 就是 Proxy 或者 InvocationHandler 的 API.

Java 5

运用到大量的新型API.
并发框架(J.U.C), 格式化(Formatter), JMX, instrument,
XML处理, DOM, SAX(Simple API FOR XML), XPATH, XSTL

Java 6

JDBC 4.0 的升级
JAXB 2.0 的升级, 就是 Java API for XML Binding, 用Java API 把 XML 进行绑定, 就是之前讲过的对 XML 的 marshal 和 unmarshal.
可插拔注解处理API, 安卓开发中称为 APT, Annotation Processing API. 在编译时帮助我们处理注解. 这部分在spring 5 中有新型的应用
Common Annotations, 通用型的注解.
从这里会发现一个特点, 从 Java 6 开始, 我们会逐步将 JSR(Java Specification Request) 也就是 Java 规范请求 引入进来,

Java Compiler API, 也就很容易发现是通过Java来编译Java

Scripting in JVM, 就是开始支持脚本语言在 JVM 上的实施, 而最早的就是 Java script.

Java 7

这一版本的特性不太明显
NIO 2.0 新的nio框架, 包括对路径上面的抽象, 异步io的支持
Fork/Join框架, 在JUC基础上做一些补充, 包括去提供一些复合Join模型, 帮助我们实现一些复杂的并行计算.
invokedynamic 字节码, 用于支持动态语言的, 比如groovy, kotlin等在 Java JVM 上的一些动态语言. https://zhuanlan.zhihu.com/p/28124632

Java 8

Stream API, 应用广泛, 对于集合的处理等等.
CompletableFuture, 主要在 Completable 的基础上做了一个 Reactive 的支持, 这是 java最早的对 Reactive 的支持
Annotation on Java Types, 感知不太明显, 暂且不说
Date and Time API, 属于日期和时间的API, 主要是解决过去 java 的时间API, 时间是可变的情况, 新的API, 比如说 DateTime 就是一个不可变的.
可重复Annotations, 这里指的就是 @Repeatable 这个注解, 用于可重复注解.
JavaScript运行时, 这个和java 6 里面的Scripting in JVM有重叠.

Java 9

spring5还没有支持, 只是简单一说
Reactive Streams Flow API (J.U.C), 对CompletableFuture的进一步支持
Process API Updates()JEP 102), 原有的JSR标准更改了, 以后统一改为JEP了. 这里就是java进程API的升级, 可以管理父子进程
Variable Handles(JEP 193), 变量处理/变量句柄, 会去替换一下 Unsafe API的接口.
Method Handles(JEP 277), 方法处理/方法句柄, MethodHandle, 这个是在反射中会用到的方法相关的API.
Spin-Wait Hints(JEP 285), 在API层面提供的自旋锁.
Stack-Walking API(JEP 259), 在我们遇到异常的时候会有一些堆栈, 堆栈通常有一个 API , StackTraceElement, 这个API的内存或者CPU的消耗特别大, 这个是对其的替换.

Spring 对JDK API 实践

< Java 5 API

在这里插入图片描述

反射(Reflection), 反射是框架的灵魂, 这个自不用说.
Java Beans, 国内不太常用, 但是国外很多用, spring也提供了大量的支持.
动态代理(Dynamic Proxy), jdkDynamicAopProxy这个就是对jdk原生的AOP的支持, 而对于aspectJ的AOP支持则是后面的事情了.

Java 5 API

在这里插入图片描述

XML 处理(DOM,SAX…), XmlBeanDefinitionReader, 这个就是将XML文件的内容转换为BeanDefinition.
Java 管理扩展(JMX), @ManagedResource@Transaction 都是这个的支持.
Instrumentation, InstrumentationSavingAgent只是对Instrumentation做了封装, 将Instrumentation的API来进行存储到本地, 因为Instrumentation这个API可以帮助我们对字节码做一些处理和提升的工作, 大多数Agent的实现都是基于Instrumentation这个API来做的.
并发框架(J.U.C), ThreadPoolTaskScheduler, 这是一个对java线程池的简单封装.
格式化(Formatter), DateFormatter, 这就类似于后来的SimpleDateFormatter, 只不过这里是spring自己的一个整合.

Java 6 API

在这里插入图片描述

JDBC 4.0(JSR 221) 1.0 + JdbcTemplate
实际上spring对JDBC的支持很早了, 这里只是针对的 JDBC 4.0, JdbcTemplate很常用, 不用多说, 谁用谁知道.

Common Annotations(JSR 250)2.5 + CommonAnnotationBeanPostProcessor
Common Annotations这个API, 提供了一些常见的java注解, 比如 @Resource, 方法
postConstruct
, preDestory, 而spring 的实现就是 CommonAnnotationBeanPostProcessor

JAXB 2.0(JSR 222) 3.0 + Jaxb2Marshaller
Java Api For XML Binding, 这是java用来将Bean转换为XML和将XML转换为Bean的一个类, 但是实际上在Java 6 之前就有了, 只不过那时是一个外部引用, 到了Java 6, 变成了一个原生的API, 因此spring 3(java 5) 其实就支持了.

Scripting in JVM(JSR 223) 4.2 + StandardScriptFactory
script(脚本语言)在JVM的支持

可插拔注解处理API(JSR 269) 5.0 + @Indexed
这个必须要 spring5, 涉及到注解的支持, 我们都知道注解大部分都是在运行时找到对应的类, 那么有没有办法在编译时进行实现? 答案是有的, 一个是 @Indexed, 就是在传统的@Component的基础上, 在编译时, 把API去做一个索引, 帮助我们快速定位到到底哪个类建了@Component索引, 这样就不需要逐一去进行扫描.
另一个是 @ComponentScan, 这个索引需要指定一个basePackages, 这个也是, 在编译时不用去扫描, 直接去找指定的位置, 得到一个索引文件. 这两种都可以减少 scanning操作, 而这个是一个运行时的操作.

Java Compiler API(JSR 199) 5.0 + TestCompiler(单元测试)
这个表面上用的很少, 但实际上与上面的 JSR 269是息息相关的,
首先要知道 APT , Annotation Processing Tool,它是javac的一个工具,中文意思为编译时注解处理器.
简单说就是在编译时处理注解的实现, 在编译时会将APT的过程加到编译器里面去, 因此在Java Compiler API里面会将APT加进去, 加进去的同时它会告诉你这个地方需要一个编译器来进行编译, 否则单元测试没法弄, 你总不能搞完之后再测是吧, 所以TestCompiler它在运行时单独建立一个编译器, 然后把APT进行编译, 最终达到测试的效果.

Java 7 API

在这里插入图片描述

Fork/Join 框架(JSR 166) 3.1 + ForkJoinPoolFactoryBean
spring对Fork/Join的支持, 就是封装了一个相关线程池的Bean工厂

NIO 2(JSR 203) 4.0 + PathResource
NIO 2 是在 Java 7 引入的, 那么这里除了传统阻塞和异步的区别, 还有Path和File的区分, 路径是路径, 文件是文件.

Java 8 API

在这里插入图片描述

Date and Time API(JSR 310) 4.0 + DateTimeContext
重新封装的时间类型API, 这个不用多说, 肯定有支持

可重复Annotations(JSR 337) 4.0 + @PropertySources
可重复标记的多个注解, 也常用, 不多说

Stream API(JSR 335) 4.2 + StreamConverter
StreamConverter就是提供一个把一个东西转换成Stream的方式

CompletableFuture(J.U.C) 4.2 + CompletableToListenableFutureAdapter
CompletableToListenableFutureAdapter就是将 CompletableFuture 和 ListenableFuture 做了一个适配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:Execution failed for task ':core:Kafka.main()'. > Process 'command 'C:/Program Files/Java/jdk1.8.0_77/jre/bin/java.exe'' finished with non-zero exit value 1 。 引用\[2\]:碰到的问题: 1)运行java的main方法出现 Process ‘command ‘D:/jdk8/bin/java.exe’’ finished with non-zero exit value 1 将idea的gradle按如下设置 2)Failed to apply plugin \[id ‘com.gradle.build-scan’\] What went wrong: An exception occurred applying plugin request \[id: ‘com.gradle.build-scan’, version: ‘1.8’\] 。 引用\[3\]:Open File(spring-beans\spring-beans.gradle ) 点击:Open File 然后注释掉 //compileGroovy.dependsOn = compileGroovy.taskDependencies.values - ‘compileJava’ 。 问题:Process 'command 'D:/JDK8/bin/java.exe'' finished with non-zero exit value 1 回答: 出现"Process 'command 'D:/JDK8/bin/java.exe'' finished with non-zero exit value 1"的错误通常是由于Java程序在执行过程中遇到了问题导致的。这个错误可能有多种原因,比如代码错误、依赖问题或者环境配置错误。根据提供的引用内容,有两个可能的解决方案。首先,你可以检查你的代码,确保没有语法错误或逻辑错误。其次,你可以检查你的依赖项和环境配置,确保它们正确设置。如果问题仍然存在,你可以尝试注释掉一些代码或者调整一些配置,以便找到问题的根本原因。希望这些解决方案能帮助你解决这个问题。 #### 引用[.reference_title] - *1* [kafka Process ‘command ‘/jdk1.8.0_77/jre/bin/java.exe finished with non-zero exit value 1](https://blog.csdn.net/qq_31686241/article/details/125113723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [IDEA导入spring5.1源码的构建](https://blog.csdn.net/qq_40088250/article/details/104219666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值