目录:
- 依赖关系
- 项目结构目录
- asm:字节码框架,能动态改变jvm⾥⾯的字节码
- cglib:代码生成库
- core:提供了基本核心模块IO/serial,codec,convert,env 等
- lang:提供了java 语言不同版本兼容的功能
- Objenesis:实例化对象的方式
- util:提供了 compare, backoff, xml, concurrent, MimeType 的方式
- 详解
- 总结
- 优秀的博文
- Spring Core 文档全面解析:
- spring源码解析---spring-core(一)_程序员ken的博客-CSDN博客
一.依赖关系
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.19</version>
</dependency>
在引入其依赖后,在项目Maven Dependencies目录可以看到多了两个jar包
那为何会多出一个spring-jcl-5.3.19.jar呢?详细请看此处:日志体系(二) 认识spring 5.0.x中的spring-jcl jar包,任意替换默认日志框架jul为log4j_AvengerEug的博客-CSDN博客
所以spring-core -> spring-jcl
二.项目结构目录
spring core下有6个包
- asm:字节码框架,能动态改变jvm⾥⾯的字节码
- cglib:代码生成库
- core:提供了基本核心模块IO/serial,codec,convert,env 等.
- lang:提供了java 语言不同版本兼容的功能.
- Objenesis:实例化对象的方式.
- util:提供了 compare, backoff, xml, concurrent, MimeType 的方式.
三.详解
3.1 asm:字节码框架,解析类元数据
字节码:⼀串字节组成的⽂件,由Java⽂件经过编译器编译得到,JVM负责加载执⾏。⽂件符合JVM规范。
ASM:我们知道Java是静态的语⾔,⼀旦编译完成是⽆法修改的,对应的像JS等动态语⾔是在执⾏器可以随意添加删除⽅法、属性的。那通过
ASM,能做到动态修改字节码⽂件,得到动态语⾔的效果。
- AnnotationVisitor类:是一个抽象类,定义在解析注解时会触发的事件,如解析到一个基本值类型的注解、enum值类型的注解、Array值类型的注解、注解值类型的注解等。
- AnnotationWriter类:继承了 AnnotationVisitor 类,用于拼接注解相关字节码。
- Attribute类:字节码中属性的类抽象。
- ByteVector类:字节码二进制存储的容器。
- ClassReader类:字节码的读取与分析引擎。它采用类似SAX的事件读取机制,每当有事件发生时,调用注册的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相应的处理。
- ClassVisitor接口:定义在读取Class字节码时会触发的事件,如类头解析完成、注解解析、字段解析、方法解析等。
- ClassWriter类:它实现了ClassVisitor接口,用于拼接字节码。
- Context类:定义了一些字节码及其属性。
- CurrentFrame类:继承自 Frame 类
总结:从这些类也可以看出来asm包下的这些都是操作字节的,所有我们在写java代码时其实很少回去碰到的,在Spring2.5.6的时候需要asmJar 包, 3.0开始提供他自己独立的asmJar
spring使用了两种方式来注入元数据获得类、注解、方法元数据信息:
- 使用ASM方式,通过加载class资源读取到相应的访问器里,来填充相应的元数据,比反射速度快很多
- 使用标准的反射,从Class对象获取类、方法、字段、注解等信息注入到元数据中
元数据:类名称、是否是注解,是否是接口、父类、成员的类名等基本信息
Spring通过MetadataReaderFactory来创建元数据读取器MetadataReader来获取元数据Metadata,还有TypeFilter(正则、类型层次、非注解)过滤元数据
ClassMetadata接口装载类元数据
-->AnnotationMedata接口不仅装载类元数据,还装载所有注解元素
-->ClassMetadataReadingVisitor直接获取元数据
AnnotatdTypeMedata接口定义被注解的类型(这里包括了类及方法)上的所有注解信息
-->MethodMedata装载了方法元数据
-->AnnotationMedata装载了注解元数据
AnnotationAttributesReadingVisitor注解访问器,finally类
3.2 cglib:代码生成库
很多时候在编译时期不能决定具体的对象类型,无法生成所需要的字节码。只能在运行时期,根据传入的实例,来生成字节码。这时就要用到动态代理
Cglib是一个强大的高性能的字节码生成工具包。底层通过字节码增强处理框架 ASM,来生成字节码并装载到JVM。脚本语言Groovy也是使用ASM来生成或修改Java的字节码。
动态代理常见的有jdk动态代理和cglib代理两种方式。jdk代理方式基于接口实现,cglib则并没有局限于接口,采用的是生成子类的方式,只要被代理类和方法不被final修饰即可
3.3 core:核心包
- 根目录:别名注册、属性访问
- AliasRegistry:别名注册
- AttributeAccessor:对对象元数据的访问接⼝
- Ordered:排序功能
- ResolvableType:统一所有类型为ResolvableType对象来操作类型spring-core组件详解——ResolvableType可解决的类型 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区
- annotation目录:注解、元注解、合并的注解等
- AliasFor:别名,通常是互相别名,SpringBoot深入理解 -- @AliasFor注解的作用
- AnnotationsProcessor:5.2新增的,处理注解以后的回调
- MergedAnnotation:5.2新增
- MergedAnnotations:5.2新增
- MergedAnnotationSelector:5.2新增
- codec
5.0新增的⽬录,⽤来实现reactive flux流功能,具体的请百度下,我也不清楚 - convert目录:主要是转换器服务,将一个类型转换位另外一个类型。
定义了很多接⼝,有ConversionService、Converter、ConverterFactory、ConverterRegistry、GenericConverter,就是⽤来给给框架或者⽤户去实现转换功能的
spring-core组件详解——类型转换系统 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区 - env目录:环境体系,主要是两部分,spring-core组件详解——环境体系 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区
Environment应用上下文环境:spring-core组件详解——Environment应用上下文环境 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区
1.profiles配置组:Profile 最常见作用于将生产环境和开发环境隔离。比如使用 @Profile 的注解(如使用 @Profile('dev') 和 @Profile('prod'))标注在不同的 Bean 上,运行时根据参数将会选择使用有 @Profile('name') 注解的类。
2.properties环境变量
PropertyResolver属性解决器:spring-core组件详解——PropertyResolver属性解决器 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区
1.通过propertyName属性名获取与之对应的propertValue属性值(getProperty)。
2.把${propertyName:defaultValue}格式的属性占位符,替换为实际的值(resolvePlaceholders)。 - io目录:这⾥的IO不是JDK⾥⾯的IO,这⾥主要是读取,底层Resource资源描述及基本资源加载器实现
可以看到,主要是输⼊流接⼝,抽象资源类以及⼦类。另外还有默认的资源加载器,⼦类⽂件系统资源加载器、类相对路径加载器 - log目录:⽇志处理⽬录,委托给Apache Commons log处理
- serializer目录:序列化和反序列化接⼝Serializer,Deserializer,以及对应的默认实现DefaultSerializer,DefaultDeserializer,默认采⽤JDK序列化机制,ObjectOutputStream和ObjectInputStream。
- style目录:转为string字符串的风格格式
- task目录:任务执⾏器,继承了JDK的Executor,⽤来执⾏Runnable类型的task
- type目录:包含被注解的类型的元数据:注解元数据、Class元数据、⽅法元数据
3.4 lang:几个注解,目前没其他东西
3.5 util:工具类
- ClassUtils :Class的类加载 、查找类全部信息、类信息的处理等
- ObjectUtilsTest:基本类型的比较或数组比较,如果认为两个数组是相等的
- PatternMatchUtils:模式匹配 xx 模式匹配 * 、*xx 、*xx* 、xx* 、*xx*y
- PropertyPlaceholderHelper:解析文本中占位符并替换成属性值
- ReflectionUtils:非常好用的反射类,得到字段、方法及过滤方法和方法回调
- ResourceUtils:这个解析定位资源非常好用 比如 classpath--URL-->File
- SerializationUtils:序列化工具
- SystemPropertyUtils:使用系统环境变量值替换占位符来生成字符串
- AnnotationUtils:注解工具类 想要解析注解请找它,绝对给力。
- BridgeMethodResolver:判断是否是桥梁方法 把桥梁方法转化为正常方法
- CollectionFactory:使用Map.class List.class等常用集合类型生产对象Map List等集合对象
- Constants:加载类中的public static final常量进行分析其信息 查找 转换等
- Conventions:根据方法返回值 、 字段、返回相应的字符串类型名称,可以用以自动化给其起别名
- ControlFlowFactory:栈轨迹信息查询 判断 类 方法 及输入值是否在栈的轨迹中
- MethodIntrospector:为类中相关方法注入数据或过滤、把类中的相应的代理方法转化为接口方法