spring ApplicationContext BeanFactory IOC

有时候很是疑惑天天挂在嘴边的ioc,什么依赖注入控制反转到底是啥,面试的时候背书就算了,工作了还是耐不住要看看源码,看看究竟是个什么鬼。
首先参考书籍-spring实战第四版,具体里面的思想理论回头再补。
现在从源码角度观察一个实例在spring中是如何被加载出来的
先从我最熟悉的使用xml配置文件加载bean的方式开始,即解析这两句代码背后的大佬:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.getBean("");
  1. 当从根据xml文件初始化生成的applicationContext获取bean时,开始调用AbstractApplicationContext的getBean方法,AbstractApplicationContext的层级结构如图:可以看到这个抽象类的顶级父接口是BeanFactory
    而抽象应用上下文中也有对getbean的方法中也有说明
//---------------------------------------------------------------------
	// Implementation of BeanFactory interface
	//---------------------------------------------------------------------

	@Override
	public Object getBean(String name) throws BeansException {
		assertBeanFactoryActive();
		return getBeanFactory().getBean(name);
	}

大概有五种getBean的重载方法,还有一些具体实现beanFactory顶级父接口的还有一些方法,可以取看下源码。
2. 上一步已经走到了抽象应用上下文中的getBean方法,如果对几个重载方法都有看到,会发现在getBean之前都会有一个断言–beanFactory是否开启的方法,那么这个方法是用来干嘛的呢?---- 这是属于一个抽象应用上下文中原子性布尔属性,用来表明当前应用上下文是否是启用状态,如果这个属性为false,会抛出两种信息:另一个标志位closed为true,则会表明当前beanFactory已被关闭,flase会表明当前工厂尚未被刷新

protected void assertBeanFactoryActive() {
		if (!this.active.get()) {
			if (this.closed.get()) {
				throw new IllegalStateException(getDisplayName() + " has been closed already");
			}
			else {
				throw new IllegalStateException(getDisplayName() + " has not been refreshed yet");
			}
		}
	}
  1. 第三步
  2. 第四步
  3. 第五步
  4. 第六步
  5. 第七步
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值