引言:
什么是IOC容器?
beanDefinitionMap,singletonObjects(单例缓冲池),PostProcessor(后置处理器)等一系列来完成springIOC核心功能的组件。而不仅仅指的是singletonObjects(单例缓冲池)。
Ioc容器初始化的流程
当我们在应用程序中使用Spring框架的时候,我们需要得到一个spring上下文,并从中得到我们需要的bean.那么spring是如何帮我们创建对象的呢?下面就让我们来看一看ioc容器初始化的流程
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(simpleConfig.class);
ctx.getBean("cat");
但我们在使用spring框架后,只需要应用程序中配置一系列注解(XML也可以,不过现在应该都是注解了吧),然后在Main方法中写上以上这行代码,得到一个spring上下文,然后就可以通过getBean()方法得到我们想要的对象。
下面让我们进入AnnotationConfigApplicationContext(simpleConfig.class)看看ioc容器是如何进行初始化的。
IOC初始化流程图
this()
public AnnotationConfigApplicationContext() {
//初始化注解模式下的Bean定义扫描器
this.reader = new AnnotatedBeanDefinitionReader(this);
//初始化ClassPath类型的Bean定义扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
register(annotatedClasses)
register的作用将Spring必须的六大配置类和加了Configuration注解类实例化并放入beanDefinitionMap中
refresh()
public void refresh() throws BeansException, IllegalStateException {
Object var1 = this.startupShutdownMonitor;
synchronized(this.startupShutdownMonitor) {
//刷新容器前的准备(开始时间/启动标志等)
this.prepareRefresh();
//刷新BeanFactory
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
//配置类的标准属性(类加载器之类的)
this.prepareBeanFactory(beanFactory);
try {
/*
* spring中并没有具体去实现postProcessBeanFactory方法,是提供给想要实现BeanFactoryPostProcessor的三方框架使用的。谁要使用谁就去 实现。
* 作用是在BeanFactory准备工作完成后做一些定制化的处理,实现BeanPostProcessor接口的使用,注入一些重要资源,或修改Bean的行为,
* 得到beanFactory,为所欲为!
*/
this.postProcessBeanFactory(beanFactory);
//找到所有的BeanFactoryPostProcessor并执行他们的方法
/*
原理:从容器中获取获取到所有的BeanDefinitionRegistryPostProcessor组件,然后依次触发所有的postProcessBeanDefinitionRegistry()方法,
再来从容器中找到BeanFactoryPostProcessor组件,然后依次触发所有的postProcessBeanFactory()方法。
*/
this.invokeBeanFactoryPostProcessors(beanFactory);
//注册BeanPostProcessor
this.registerBeanPostProcessors(beanFactory);
//初始化initMessageSource组件,用于国际化等
this.initMessageSource();
//初始化自定义事件广播器
this.initApplicationEventMulticaster();
//初始化其它的特殊bean(子类增强器)
this.onRefresh();
//注册监听器
this.registerListeners();
//初始化Spring单例Bean ----》完成bean的一系列装配
this.finishBeanFactoryInitialization(beanFactory);
//完成初始化,发布初始化事件
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
思考
1. 为什么创建DefaultListableBeanFactory而不是其它的BeanFactory?
继承了所有BeanFactory,功能最全。
2. BeanFactory和ApplicationContext的关系?
组合关系,ApplicationContext在BeanFactory的基础上扩展了很多功能