学习基于Spring框架开发的核心功能源码时, 首先得清楚以下3个知识点

Posted by JoshSu Blog on October 1, 2018

概要

学习基于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实现一些功能时, 才能清楚的知道在哪个步骤来实现这个功能。

spring框架初始化流程

重要的流程如下:

  1. obtainFreshBeanFactory(). 获取解析bean定义, 一定要明白自定义标签的解析原理。
  2. invokeBeanFactoryPostProcessors(beanFactory). 很重要, ioc容器级别的后置处理器。
  3. registerBeanPostProcessors(beanFactory). 非常重要, 注册BeanPostProcessor, 为后续实例化单例bean时使用。
  4. finishBeanFactoryInitialization(beanFactory). 非常重要, 为IOC容器提前装配所需要的所有Bean.

不多说, 一定要对以上流程非常熟悉。

实例化单例bean的流程

实例化单例bean的流程

该流程只列举了一个重要的步骤(这里的重要只是因为我们可以在这一步置入一些逻辑), 其他的并没有罗列。

在实例化单例Bean时, 可以对Bean进行一系列的额外处理, 对Bean做特定逻辑以及各种增强都是在这里面完成的。

总结

了解了以上知识点, 仿照Spring框架手写一个简化版的IOC容器及MVC都是So Easy的事。

git@github.com:joshsulin/notemvcframework.git 这是我手写的一个简化版的, 有兴趣的朋友可以下载来看看。