¶spring-core模块源码阅读准备
¶模块组成
- asm
- cglib
- core
- lang
- objenesis
- util
¶模块详解
¶asm
¶asm是什么?
- asm是一个java字节码操控框架(修改字节码),它能被用来动态生成或者增强现有类的功能,是cglib技术的基础。
- asm使用访问者模式实现,java类作为需要访问的元素,而asm框架定义java类的访问者,所有的对java类的操作都在访问者这里完成。
¶ASM与APT、aspectJ、Javassit
- APT
APT(Annotation Processing Tool),是一个注解处理器,是javac的一个工具,在编译时扫描和处理注解,可以在代码编译期解释注解,并且生成新的Java文件,减少手动输入代码。 - aspectJ
是一个面向切面的框架,aspectJ定义了AOP语法,它用专门的编译器生成java字节码文件。它可以在某一个方法的前后插入部分代码,也就是在生成class时动态织入代码。 - Javassit
是一个开源的分析,编辑和创建Java字节码的类库。
APT是在源码阶段修改java文件,aspectJ是在生成class时修改class,ASM与Javassit差不多,都是修改已经生成的class文件。
¶cglib
¶cglib是什么?
- cglib(code generator library),是一个高性能的代码生成库。
- cglib基于asm技术,可以对字节码(class)进行操作,因此被广泛应用于AOP,将方法动态织入class中。
- 它也是spring实现的一种动态代理技术,它也被用在Hibernate框架中。
¶cglib动态代理与jdk动态代理
- cglib动态代理是使用asm技术实现,将代理对象类的class字节码文件加载进来,通过修改其字节码生成子类。cglib只能针对类实现代理。
- jdk动态代理是使用反射技术实现,利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。jdk动态代理只能对实现相同接口的类生成代理。
¶core
- core是spring-core模块的核心实现代码,其他的包(asm,objenesis,cglib)都是spring-core引入的依赖库。
¶lang
- lang包中提供spring中定义注解元素不为空的注解类。
¶objenesis
¶objenesis是什么?
- objenesis,是一个用来实例化一些特殊类的新对象的java库。
- java支持使用Class.newInstance()进行动态实例化,但是它只是适用于适当的构造器。当类中包含需要参数的构造器,有副作用的构造器以及抛出异常的构造器时,java提供的动态实例化就不再适用。
- 在库中常见的限制是类必须要默认构造函数,objenesis旨在绕过对象实例化的构造函数来克服这些限制。
¶objenesis使用场景
objenesis一般使用在不需要调用构造函数就能实例化对象的场景。
- 序列化(Serialization),远程调用(Remoting)和持久化(Persistence)。要求对象需要被实例化并还原到特定状态,而不需要调用代码。
- 代理(Proxies),面向切面编程(AOP)和模拟对象(Mock Objects)。类可以被子类化,而不需要担心super()构造器。
- 容器框架(Container Frameworks)。在非标准的情况下类被动态实例化。
¶util
- 工具类,提供一些必要的工具。
¶spring-core模块功能
BeanFactory是spring最核心的组件,而spring-core则为BeanFactory的定义提供基础服务。spring-core中最核心的部分则是core中的代码。其他部分的代码都是为core中的代码服务。