Bean 实 例 化 的 基 本 流 程
加 载xml配置文件,解 析 获 取 配 置 中 的 每 个 < bean > 的 信 息 , 封 装 成 一 个 个 的 BeanDefinition 对 象 ;
将 BeanDefinition 存 储 在 一一个 名 为 beanDefinitionMap 的 Map<String,BeanDefinition> 中 ;ApplicationContext 底 层 遍 历 beanDefinitionMap, 创 建 Bean 实 例 对 象 ;
创 建 好 的 Bean 实 例 对 象 , 被 存 储 到 一 个 名 singletonObjects Map<String,Object> 中 ;当 applicationContext.getBean(beanName) 时,从 singletonObjects 去 匹 配 Bean 实 例 返 回 。
Spring 的 后 处 理 器
Spring 的 后 处 理 器 是 Spring 对 外 开 发 的 重 要 扩 展 点 , 允 许 我 们 介 入 到 Bean 的 整 个 实 例 化 流 程 中 来 , 以 达 到 动 态 注 册
BeanDefinition, 动 态 修 改 BeanDefinition, 以 及 动 态 修 改 Bean 的 作 用 。 Spring 主 要 有 两 种 后 处 理 器 :
- BeanFactoryPostProcessor: Bean 工 厂 后 处 理 器 ,在BeanDefinitionMap 填 充 完 毕 , Bean 实 例 化 之 前 执行;
Bean 工 厂 后 处 理 器 一 BeanFactoryPostProcessor
Spring 提 供 了 一 个 BeanFactoryPostProcessor 的 子 接 口 BeanDefinitionRegistryPostProcessor 专 门 用 于 注 册
BeanDefinition 操 作
public class MyBeanFactoryPostProcessor2
@Override
public void post ProcessBeanFactory (ConfigurableListab1eBeanFactory
configurableListab1eBeanFactory) throws BeansException { }
@Override
public void post ProcessBeanDefinitionRegistry (BeanDefinitionRegistry beanDefinitionRegistry)
throws BeansException {
BeanDefinition beanDefinition new RootBeanDefinition ( ) ;
beanDefinition.setBeanC1assName ( " com. itheima. dao . UserDaoInp12 " )
beanDefinitionRegistry.registerBeanDefinition ( "userDa02 " , beanDefinition) ;
- BeanPostProcessor: Bean 后 处 理 器 , 一 般 在 Bean 实 例 化 之 后 , 填 充 到 单 例 池 singletonObjects 之 前 执 行 。
Bean 后 处理器 一 BeanPostProcessor
Bean 被 实 例 化 后 到 最 终 缓 存 到 名 为 singletonObjects 单 例 池 之 前 , 中 间 会 经 过 Bean 的 初 始 化 过 程 , 例 如 :属 性 的填 充 、 初 始 方 法 init 的 执 行 等 , 其 中 有 一 个 对 外 进 行 扩 展 的 点 Bean PostProcessor, 我 们 称 为 Bean 后 处 理 。 跟 上 面 的Bean 工 厂 后 处 理 器 相 似 , 它 也 是 一 个 接 口 , 实 现 了 该 接 口 并 被 容 器 管 理 的 BeanPostProcessor , 会 在 流 程 节 点 上 被
Spring 自 动 调 用 。