概要
学习基于Spring框架的核心功能源码时, 我认为首先得明白反射机制
、Spring框架初始化流程
以及单例bean实例化流程
等相关知识细节。以便于学习其他优秀功能源码时, 才能明白为什么要那样做。
掌握了这些知识点, 仿照Spring框架手写一个简化版的IOC容器及MVC都是So Easy的事。
反射
Java反射机制是在运行状态
中, 对于任意一个类, 都能够知道这个类的所有属性和方法
; 对于任意一个对象, 都能够调用它的任意方法和属性; 这种动态获取
信息以及动态调用对象方法的功能称为Java语言的反射机制。
常用方法
1、获取直接继承的父类
Class.getSuperclass(); 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。 如果此Class表示Object类、一个接口、一个基本类型或void, 则返回null。
2、获取反射对象(反射入口)
Class. A、Class.forName(全类名); B、类名.class; C、对象.getClass();
3、判断类上是否存在某个注解
clazz.isAnnotationPresent() 同时也存在clazz.isAnnotation(), 先推荐使用前者
4、当存在某个注解时, 先获取到注解, 然后再通过注解获取到注解上的属性
注解Class 注解object = clazz.getAnnotation(注解.class) 注解object.属性
5、获取类实现了哪些接口?
Class<?>[] interfaces = clazz.getInterfaces();
6、获取到所有属性
Field[] fields = getFields() -> 获取所有public字段, 包括父类字段 Field[] fields = getDeclaredFields() -> 获取所有字段, publish和projected和private, 但是不包括父类字段。
7、获取属性上是否存在某个注解
field.isAnnotationPresent(注解.class) 同时也存在 field.isAnnotation()
8、向属性设置新值
设置一个强制赋值的表达式: field.setAccessible(true)。 field.set(Object obj, Object value); -> 第1个参数obj: 表示当前类对象。
9、获取类里面有哪些方法?
Method[] methods = clazz.getMethods()
10、获取方法上是否存在某个注解
method.isAnnotationPresent(注解.class)
11、当方法上存在某个注解时, 先获取到注解, 然后再通过注解获取到注解上的属性
注解Class 注解object = method.getAnnotation(注解.class). 注解object.属性
12、获取方法参数列表
Class<?>[] parameterTypes = method.getParameterTypes();
以上这些方法都得非常熟悉的运用。Spring框架实现的核心应该来说就是反射了。
Spring框架初始化流程
要想对Spring框架进行深入学习, 肯定得清楚Spring框架初始化的步骤, 清楚每个步骤干了什么事? 这样才能应用自如, 当某一天想基于Spring实现一些功能时, 才能清楚的知道在哪个步骤来实现这个功能。
重要的流程如下:
- obtainFreshBeanFactory(). 获取解析bean定义, 一定要明白自定义标签的解析原理。
- invokeBeanFactoryPostProcessors(beanFactory). 很重要, ioc容器级别的后置处理器。
- registerBeanPostProcessors(beanFactory). 非常重要, 注册BeanPostProcessor, 为后续实例化单例bean时使用。
- finishBeanFactoryInitialization(beanFactory). 非常重要, 为IOC容器提前装配所需要的所有Bean.
不多说, 一定要对以上流程非常熟悉。
实例化单例bean的流程
该流程只列举了一个重要的步骤(这里的重要只是因为我们可以在这一步置入一些逻辑), 其他的并没有罗列。
在实例化单例Bean时, 可以对Bean进行一系列的额外处理, 对Bean做特定逻辑以及各种增强都是在这里面完成的。
总结
了解了以上知识点, 仿照Spring框架手写一个简化版的IOC容器及MVC都是So Easy的事。
git@github.com:joshsulin/notemvcframework.git 这是我手写的一个简化版的, 有兴趣的朋友可以下载来看看。