spring流程
AbstractApplicationContext.refresh()
1、创建beanFactory{
1、new DefaultListableBeanFactory(null)
2、给beanFactroy设置一堆属性组件供以后使用
3、设置beanFactory的autowireCandidateResolver,
beanFactory.setAutowireCandidateResolver(
new QualifierAnnotationAutowireCandidateResolver());
4、加载xml变为BeanDefinition对象、实例化bean对象
loadBeanDefinitions(beanFactory);//-->AbstractXmlApplicationContext{
xmlreader.loadBeanDefinitions(configResources);{
// 1、xml转doc
Document doc = documentLoader.loadDocument(xxx);{// DefaultDocumentLoader
}
// 2、doc转BeanDefinition
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));{
// DefaultBeanDefinitionDocumentReader
1、创建delegate = new BeanDefinitionParserDelegate对象
2、交给delegate去解析<bean>节点,注意这里得到的是holder对象
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);{
1、AbstractBeanDefinition bd = new GenericBeanDefinition;
2、一堆ifelse解析标签属性设置到bd对象属性上
}
3、注册到beanFactory的map里
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
/*
beanFactory
bd属性
|-beanDefinitionMap 类型Map<String, BeanDefinition>,key是beanName,value是bd对象
|-beanDefinitionNames 类型List<String>,元素是beanName
*/
}
}
}
}
2、给beanFactory设置一堆众小弟
3、提前实例化beanFactroy里所有 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 实例
调用它们的方法修改beanFactory做个性化逻
4、提前实例化beanFactory里所有 BeanPostProcessor ,跟C同理通过getBean实例化并分为4组,
加入到beanFactory的BeanPostProcessor属性里(这是个ArrayList
注:会先手动加入new BeanPostProcessorChecker(用于打印普通bean创建成功日志),等上面4组加入完成,最后再手动加入new ApplicationListenerDetector(探测普通bean如果实现了ApplicationListener接口,按照监听者模式这些bean就是监听器,把这些bean的引用放到一个地方,当有事件发生时,调用所有监听器)
5、
标签:bd,beanFactory,doc,流程,bean,实例,new,tmpspring From: https://www.cnblogs.com/bplan/p/18426117