有时候很是疑惑天天挂在嘴边的ioc,什么依赖注入控制反转到底是啥,面试的时候背书就算了,工作了还是耐不住要看看源码,看看究竟是个什么鬼。
首先参考书籍-spring实战第四版,具体里面的思想理论回头再补。
现在从源码角度观察一个实例在spring中是如何被加载出来的
先从我最熟悉的使用xml配置文件加载bean的方式开始,即解析这两句代码背后的大佬:
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
ctx.getBean("");
- 当从根据xml文件初始化生成的applicationContext获取bean时,开始调用AbstractApplicationContext的getBean方法,AbstractApplicationContext的层级结构如图:
而抽象应用上下文中也有对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");
}
}
}
- 第三步
- 第四步
- 第五步
- 第六步
- 第七步