spring 解析初始化过程

1.xmlbeandefinitionreader 读取解析文件 解析encodedResource 编码,
校验dtd,xsd,可以手动配置,没有配置自动检测,检测方法有没有doctype  resolveEntity 本地dtd 文件头 publicId systemId
忽略接口 beannameaware,beanfactoryaware beanclassloaderaware 
(资源文件classpathresource filesystemresource ...包装,同一实现resource 接口 ,底层文件操作一个方法)
最后获取document

2.xmlbeanfactoryreader sax 解析document 生成
3.DefaultBeanDefinitionDocumentReader 提取root,记录上下文
   解析profile 分支,生成代理为了解析自定义节点 ,根据namespace 判断是否是自定义节点,然后对应节点 default节点 custom节点
解析bean beans alias import 


4.解析生成beandefinition 生成GenericBeanDefinition 承载实例 
  后解析剩余属性 scope lazy-init singleton factory-method destoy-method 等
  解析look-up replace-method 
  构造函数 ref 和value 不一样 的,但是都继承 BeanMetadataElement接口返回值一样的
  如果有子元素在解析子元素
  list map set property等
  解析完成后再GenericBeandefinition 中也在abstractbeandefinition 中存放
  
在 beandefinitionRegistry 中注册,注册前进行method-overrides 校验,beanDefinitionMap 是否有注册并且是否是可覆盖,defaultlistAblebeanfactory
清空解析留下的缓存。

获取bean 时直接在此获得
///////////////////////////解析完成
ConfigurableListableBeanFactory
1.beanName转换:别名转换和beanfactory类型的调用getObject方法得到
defaulsingletonbeanRegistry 单例注册地
abstractBeanfactory 里面getBean方法获得bean
如果缓存不等于空直接获得bean ,根据bean类型判断是否是beanfactory ,是否是单例factoryBeanObjectCache ,单例做缓存 是调用getObject,
调用 一系列 postProcess方法 如BeanPostProcessor  BeanFactoryPostProcessor  允许做一层代理,返回bean 实例
实例完之后,添加依赖,autowireByName 除去简单的string 等的,通过properties 属性,递归调用getBean 赋值,dependMap 存放bean 依赖
注册初始化方法,比如beanNameAware beanfactoryAware
如果允许提前暴露,则根据dependMap 获得依赖添加校验抛异常
注册disposeBean方法


单例循环依赖,
 1构造器解决不了抛出异常
 2setter 提前暴露objectfactory 得到引用
 2prototype 抛异常
 
 2.PropertyEditorSupport 属性编辑器 自定义扩展类
 3.调用 一系列 postProcess方法 如BeanPostProcessor  BeanFactoryPostProcessor 
 

你可能感兴趣的:(java)