Spring源码阅读(二)

134 阅读2分钟

image.png 「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

上次说到Spring中的核心IOC包括BeanFactory和ApplicationContext,接下来讲讲BeanFactory提供的功能

BeanFactory

Beanfactory作为容器的顶层接口,只提供了应用中各种bean的查找方式,如,根据bean的类型或者bean的名称查找容器中的对象。查找功能当然是我们关心的功能,但是IOC容器是怎么知道bean在哪里并将bean实例化的呢?这个涉及到接口BeanDefinitionRegistry,如下:

image.png BeanFactory的一个实现DefaultListableBeanFactory中就实现了该接口,通过读取xml配置文件,将配置文件里的bean定义信息用编码的方式注册到IOC容器当中,api接口如下:

public interface BeanDefinitionRegistry extends AliasRegistry {
// 注册bean定义
void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
// 移除bean定义
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 根据注册的bean名称获取bean定义
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
// 判断bean定义是否在容器中存在
boolean containsBeanDefinition(String beanName);
// 获取所有的注册bean名称
String[] getBeanDefinitionNames();
// 统计
int getBeanDefinitionCount();
// 判断bean名称是否已被使用
boolean isBeanNameInUse(String beanName);

由上面的信息可以知道,BeanDefinitionRegistry可以往IOC容器注册bean,注册时需用BeanDefinition对象封装bean的元数据信息,如:bean的依赖信息,是否懒加载,是否是工厂bean,亦或者bean的属性信息。 通过BeanDefinitionRegistry,我们可以在容器运行时期动态注册bean对象,这在一些场景中非常有用。

容器的启动

IOC容器从启动到bean可以投入使用,可以简单分为两个阶段,容器的启动为bean进行初始化这两个阶段:
容器启动:

1、读取配置文件。  
2、解析配置文件并加载bean定义,即`BeanDefinition`,然后将这些bean的元数据信息注册到容器里,这样容器就可以知道我们应用中到底都有哪些bean对象,为bean注入打下坚实的基础。  
3、容器的后置处理,如果bean注册到容器之后还需要进行一些操作,如:配置文件中占位符替换,或者配置文件中加密的信息进行处理,都可以在这个阶段进行。 

bean的初始化:
主要是为我们应用中的bean进行实例化,并将依赖进行注入的过程。再此过程中容器还提供bean的生命周期管理以及一些容器的各种回调函数的注册,如:BeanNameAware等。