Spring 源码讲解:bean 的创建流程 - 公开课笔记

Spring 官网所有版本下载

官网文档中的链接找起来比较麻烦。我们可以通过下面这个链接:
https://repo.spring.io/release/org/springframework/spring/

IOC,AOP

IOC 容器

当我们需要获取对象的时候,可以创建一个工厂类,让工厂类帮我们创建对象。能不能把这个过程让别人来做?
我们只需要知道容器里有对象,我们只要拿来用就好了。至于谁创建的,什么时候创建的,这都不需要你操心。
这时候你会想,假设有一个管理器,给你分配 bean,并且可以满足你的个性化需求,这样就好了。

于是,我们有了 IOC 容器。
IOC 容器,是使用 Map 存放对象的地方,对象是通过反射创建的。
默认情况下,对象在 IOC 容器中都是单例的。如果需要多例,可以修改属性。

IOC 和 DI 的关系?

IOC 是控制翻转,DI 是依赖注入。
IOC 和 DI 是从不同的角度描述同一件事情,IOC 是从容器的角度考虑的,而 DI 是从应用程序的角度考虑的。
IOC 只是一种思想,而 DI 才是具体的实现方式。

什么是控制翻转?

有了 IOC 之后,依赖的对象直接由 IOC 容器创建后,注入到对象中。
由我们主动创建,变成了被动接受,这就是控制反转。

bean 对象信息读取

但是,容器怎么知道你需要什么对象呢?你需要告诉容器,比如通过配置 xml 文件,比如使用注解。BeanDefiniton 就是用来定义类的信息的,你把信息传输给容器,容器接收到信息之后,才能创建对应的对象。
在程序启动的时候,需要把这些定义信息读取进来。但是,有的人用 xml,有的人用注解,怎么统一呢?
这时候,定义一 个 BeanDefinitonReader,用来读取 Bean 的定义信息,如果以后有了新的方式定义 Bean 信息,只需要实现当前接口,就可以了。BeanDefinitonReader 是一个接口,下面有很多不同的实现类,就是很多不同的读取方式。
在这里插入图片描述

创建对象

拿到对象信息之后,需要进行实例化操作。我们知道,创建对象可以通过 new / 工厂 / 反射 的方式实现。

实际上,Spring 是通过反射的方式创建对象的。
BeanFactory 工厂,可以用来生产对象、访问工厂。

// bean 实例化,只是一个空对象,没有任何属性值
Constructor constructor = TestClass.class.getConstructor();
Object o = constructor.newInstance();

在这里插入图片描述

BeanFactoryPostProcessor 接口:
子类实现如下
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

你也可以自己实现一个 BeanFactoryPostProcessor:
拿到 bean 的名称,解析 bean,获取到 bean 的 definition,就可以进行处理了。
在这里插入图片描述

实例化

BeanProcessor 里面有 Before / AfterInitialization

AOP 实现机制:动态代理
  • cglib
  • jdk

在这里插入图片描述

那content…Getbean拿到的是代理类还是反射后的实例呀?
这就是三级缓存存在的意义。

BeanFactory 和 FactoryBean 的区别
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/107644208