揭秘 Spring BeanFactory 初始化的奥秘
2024-01-04 19:49:50
在 Spring 框架中,BeanFactory 是一个非常重要的组件,它负责管理和创建 Bean。在 Spring 应用启动时,BeanFactory 会经历一个初始化的过程,以确保 Bean 可以正确地创建和使用。
Spring BeanFactory 的初始化过程主要由 AbstractApplicationContext#refresh 方法完成,其中 obtainFreshBeanFactory() 方法负责创建新的 BeanFactory。
在 obtainFreshBeanFactory() 方法中,首先会创建一个 DefaultListableBeanFactory 实例,然后调用其 preInstantiateSingletons() 方法预先实例化单例 Bean。
预先实例化单例 Bean 的目的是为了在应用启动时就创建好一些基础 Bean,以便其他 Bean 在创建时可以使用这些基础 Bean。
例如,Spring 会预先实例化一些基础设施 Bean,如 BeanFactoryPostProcessor、BeanPostProcessor、ApplicationListener 等。
在预先实例化单例 Bean 之后,BeanFactory 会调用其 postProcessBeanFactory() 方法,允许 BeanFactoryPostProcessor 对 BeanFactory 进行后处理。
BeanPostProcessor 可以用来修改 Bean 的定义,或者在 Bean 创建时进行一些额外的操作。
在 postProcessBeanFactory() 方法执行完毕后,BeanFactory 会调用其 postProcessBeanDefinitionRegistry() 方法,允许 BeanDefinitionRegistryPostProcessor 对 BeanDefinitionRegistry 进行后处理。
BeanDefinitionRegistryPostProcessor 可以用来修改 Bean 的定义,或者向 BeanFactory 中注册新的 BeanDefinition。
在 postProcessBeanDefinitionRegistry() 方法执行完毕后,BeanFactory 会调用其 instantiateBeans() 方法,开始实例化所有非懒加载的 Bean。
在实例化 Bean 的过程中,BeanFactory 会调用 BeanPostProcessor 的 postProcessBeforeInitialization() 方法和 postProcessAfterInitialization() 方法,允许 BeanPostProcessor 在 Bean 初始化前后进行一些额外的操作。
在所有非懒加载的 Bean 实例化完毕后,BeanFactory 的初始化过程就完成了。
BeanFactory 初始化的过程看似复杂,但实际上 Spring 已经将其封装得非常好了,开发者只需要了解其基本原理即可。
通过理解 BeanFactory 的初始化过程,我们可以更好地理解 Spring 容器的运作原理,并可以更有效地使用 Spring 框架。