Spring之IoC 容器源码分析

/**
* Ioc 容器源码分析基础案例
*/
@Test
public void testIoC() {
 ApplicationContext applicationContext = new 
ClassPathXmlApplicationContext("classpath:applicationContext.xml");
 LagouBean lagouBean = applicationContext.getBean(LagouBean.class);
 System.out.println(lagouBean);
}

我们以 ClasspathXmlApplicationContext 为例,深⼊源码分析:

一. 分析 Bean 的创建是在容器初始化时还是在 getBean 时

根据断点调试,我们发现,在未设置延迟加载的前提下,Bean 的创建是在容器初始化过程中完成的。

二. 分析构造函数调⽤情况

 

 通过如上观察,我们发现构造函数的调⽤时机在AbstractApplicationContext类refresh⽅法的
finishBeanFactoryInitialization(beanFactory)处;

三. 分析 InitializingBean 之 afterPropertiesSet 初始化⽅法调⽤情况

 观察调⽤栈

 通过如上观察,我们发现 InitializingBean中afterPropertiesSet ⽅法的调⽤时机也是在
AbstractApplicationContext类refresh⽅法的finishBeanFactoryInitialization(beanFactory);

四. 分析BeanFactoryPostProcessor 初始化和调⽤情况

分别在构造函数、postProcessBeanFactory ⽅法处打断点,观察调⽤栈,发现

BeanFactoryPostProcessor 初始化在AbstractApplicationContext类refresh⽅法的
invokeBeanFactoryPostProcessors(beanFactory);

postProcessBeanFactory 调⽤在AbstractApplicationContext类refresh⽅法的
invokeBeanFactoryPostProcessors(beanFactory);

五. 分析 BeanPostProcessor 初始化和调⽤情况

分别在构造函数、postProcessBeanFactory ⽅法处打断点,观察调⽤栈,发现
BeanPostProcessor 初始化在AbstractApplicationContext类refresh⽅法的
registerBeanPostProcessors(beanFactory);

postProcessBeforeInitialization 调⽤在AbstractApplicationContext类refresh⽅法的
finishBeanFactoryInitialization(beanFactory);

postProcessAfterInitialization 调⽤在AbstractApplicationContext类refresh⽅法的
finishBeanFactoryInitialization(beanFactory);

六. 总结

根据上⾯的调试分析,我们发现 Bean对象创建的⼏个关键时机点代码层级的调⽤都在
AbstractApplicationContext 类 的 refresh ⽅法中,可⻅这个⽅法对于Spring IoC 容器初始化来说相当关键,汇总如下:

关键点

触发代码

构造器

refresh#finishBeanFactoryInitialization(beanFactory)(beanFactory)

BeanFactoryPostProcessor 初始化

refresh#invokeBeanFactoryPostProcessors(beanFactory)

BeanFactoryPostProcessor ⽅法调⽤

refresh#invokeBeanFactoryPostProcessors(beanFactory)

BeanPostProcessor 初始化

registerBeanPostProcessors(beanFactory)

BeanPostProcessor ⽅法调⽤

refresh#finishBeanFactoryInitialization(beanFactory)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值