spring学习之路2 - spring-core

目录:

  1. 依赖关系
  2. 项目结构目录
    1. asm:字节码框架,能动态改变jvm⾥⾯的字节码
    2. cglib:代码生成库
    3. core:提供了基本核心模块IO/serial,codec,convert,env 等
    4. lang:提供了java 语言不同版本兼容的功能
    5. Objenesis:实例化对象的方式
    6. util:提供了 compare, backoff, xml, concurrent, MimeType 的方式
  3. 详解
  4. 总结
  5. 优秀的博文
    1. Spring Core 文档全面解析:
    2. 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个包

  1. asm:字节码框架,能动态改变jvm⾥⾯的字节码
  2. cglib:代码生成库
  3. core:提供了基本核心模块IO/serial,codec,convert,env 等.
  4. lang:提供了java 语言不同版本兼容的功能.
  5. Objenesis:实例化对象的方式.
  6. util:提供了 compare, backoff, xml, concurrent, MimeType 的方式.

三.详解

3.1 asm:字节码框架,解析类元数据

字节码:⼀串字节组成的⽂件,由Java⽂件经过编译器编译得到,JVM负责加载执⾏。⽂件符合JVM规范。
ASM:我们知道Java是静态的语⾔,⼀旦编译完成是⽆法修改的,对应的像JS等动态语⾔是在执⾏器可以随意添加删除⽅法、属性的。那通过
ASM,能做到动态修改字节码⽂件,得到动态语⾔的效果。

  1. AnnotationVisitor类:是一个抽象类,定义在解析注解时会触发的事件,如解析到一个基本值类型的注解、enum值类型的注解、Array值类型的注解、注解值类型的注解等。
  2. AnnotationWriter类:继承了 AnnotationVisitor 类,用于拼接注解相关字节码。
  3. Attribute类:字节码中属性的类抽象。
  4. ByteVector类:字节码二进制存储的容器。
  5. ClassReader类:字节码的读取与分析引擎。它采用类似SAX的事件读取机制,每当有事件发生时,调用注册的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相应的处理。
  6. ClassVisitor接口:定义在读取Class字节码时会触发的事件,如类头解析完成、注解解析、字段解析、方法解析等。
  7. ClassWriter类:它实现了ClassVisitor接口,用于拼接字节码。
  8. Context类:定义了一些字节码及其属性。
  9. CurrentFrame类:继承自 Frame 类

总结:从这些类也可以看出来asm包下的这些都是操作字节的,所有我们在写java代码时其实很少回去碰到的,在Spring2.5.6的时候需要asmJar 包, 3.0开始提供他自己独立的asmJar

spring使用了两种方式来注入元数据获得类、注解、方法元数据信息:

  1. 使用ASM方式,通过加载class资源读取到相应的访问器里,来填充相应的元数据,比反射速度快很多
  2. 使用标准的反射,从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:核心包

  1. 根目录:别名注册、属性访问
    1. AliasRegistry:别名注册
    2. AttributeAccessor:对对象元数据的访问接⼝
    3. Ordered:排序功能
    4. ResolvableType:统一所有类型为ResolvableType对象来操作类型spring-core组件详解——ResolvableType可解决的类型 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区
  2. annotation目录:注解、元注解、合并的注解等
    1. AliasFor:别名,通常是互相别名,SpringBoot深入理解 -- @AliasFor注解的作用
    2. AnnotationsProcessor:5.2新增的,处理注解以后的回调
    3. MergedAnnotation:5.2新增
    4. MergedAnnotations:5.2新增
    5. MergedAnnotationSelector:5.2新增
  3. codec
    5.0新增的⽬录,⽤来实现reactive flux流功能,具体的请百度下,我也不清楚
  4. convert目录:主要是转换器服务,将一个类型转换位另外一个类型。
    定义了很多接⼝,有ConversionService、Converter、ConverterFactory、ConverterRegistry、GenericConverter,就是⽤来给给框架或者⽤户去实现转换功能的
    spring-core组件详解——类型转换系统 - 拉风小野驴的个人空间 - OSCHINA - 中文开源技术交流社区
  5. 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)。
  6. io目录:这⾥的IO不是JDK⾥⾯的IO,这⾥主要是读取,底层Resource资源描述及基本资源加载器实现

    可以看到,主要是输⼊流接⼝,抽象资源类以及⼦类。另外还有默认的资源加载器,⼦类⽂件系统资源加载器、类相对路径加载器
  7. log目录:⽇志处理⽬录,委托给Apache Commons log处理
  8. serializer目录:序列化和反序列化接⼝Serializer,Deserializer,以及对应的默认实现DefaultSerializer,DefaultDeserializer,默认采⽤JDK序列化机制,ObjectOutputStream和ObjectInputStream。
  9. style目录:转为string字符串的风格格式
  10. task目录:任务执⾏器,继承了JDK的Executor,⽤来执⾏Runnable类型的task
  11. type目录:包含被注解的类型的元数据:注解元数据、Class元数据、⽅法元数据

3.4 lang:几个注解,目前没其他东西
3.5 util:工具类

  1. ClassUtils :Class的类加载 、查找类全部信息、类信息的处理等
  2. ObjectUtilsTest:基本类型的比较或数组比较,如果认为两个数组是相等的
  3. PatternMatchUtils:模式匹配 xx 模式匹配 * 、*xx 、*xx* 、xx* 、*xx*y
  4. PropertyPlaceholderHelper:解析文本中占位符并替换成属性值
  5. ReflectionUtils:非常好用的反射类,得到字段、方法及过滤方法和方法回调
  6. ResourceUtils:这个解析定位资源非常好用 比如 classpath--URL-->File
  7. SerializationUtils:序列化工具
  8. SystemPropertyUtils:使用系统环境变量值替换占位符来生成字符串
  9. AnnotationUtils:注解工具类 想要解析注解请找它,绝对给力。
  10. BridgeMethodResolver:判断是否是桥梁方法 把桥梁方法转化为正常方法
  11. CollectionFactory:使用Map.class List.class等常用集合类型生产对象Map List等集合对象
  12. Constants:加载类中的public static final常量进行分析其信息 查找 转换等
  13. Conventions:根据方法返回值 、 字段、返回相应的字符串类型名称,可以用以自动化给其起别名
  14. ControlFlowFactory:栈轨迹信息查询 判断 类 方法 及输入值是否在栈的轨迹中
  15. MethodIntrospector:为类中相关方法注入数据或过滤、把类中的相应的代理方法转化为接口方法

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值