tmpspring流程

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、

posted @ 2024-09-22 23:42  bplan2010  阅读(16)  评论(0)    收藏  举报