springioc原理
调用refresh()里面的13个方法
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 1.调用容器准备刷新的方法,获取当前时间和同步标识
prepareRefresh();
// 2.调用子类的refreshBeanFactory()方法,Bean定义资源文件的载入从这里启动
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//详解:通过XmlBeanDefinitionReader读取配置文件,然后我们可以看到beanfinitionMap
//和beanfinitName里面有关于我们注入的bean的属性
// 3.为beanFactory配置事件处理器、类加载器等,其实就是对我们的bean工厂属性填充
prepareBeanFactory(beanFactory);
try {
// 4.为容器的某些子类指定特殊的Post事件处理器,我们可以实现他的接口,
//修改一些属性,例如:是否单例,属性值啊
postProcessBeanFactory(beanFactory);
// 5.调用所有注册的BeanFactoryPostProcesser的Bean
invokeBeanFactoryPostProcessors(beanFactory);
// 6.为BeanFactory注册Post事件处理器
registerBeanPostProcessors(beanFactory);
// 7.国际化初始化
initMessageSource();
// 8.初始化事件传播器
initApplicationEventMulticaster();
// 9.调用子类某些特殊的Bean初始化方法
onRefresh();
// 10.为上面的事件传播器注册事件监听器
registerListeners();
// 11.初始化所有单例Bean(创建bean重要方法)
finishBeanFactoryInitialization(beanFactory);
//详解:调用preInstantiateSingletons方法里有个getbean()
// 1. 实例化bean: 调用dogetbean-->createBean()-->docreatebean-->
// docreatebeanInstance-->instantiatebean-->这里面的这个方法无
//参构造器完成实例化bean
// beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
// 2.属性填充: 在docreateBean()里面的population方法
// 3.initializeBean 初始化bean: 判断是否实体类有实现Aware接口
//如果有的话,对这些类进行属性填充
// applyBeanPostProcessorsBeforeInitialization前置处理器
//判断用户是否自定义init-method方法
//applyBeanPostProcessorsAfterInitialization后置处理器
//这里实现了beanpostprocessors类,拿到需要代理的bean通过这个类
//可以实现动态代理AOP
// 12.完成初始化
finishRefresh();
}
catch (BeansException ex) {
// 销毁已创建的Bean
destroyBeans();
// 取消刷新并重置标识
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}