xml解析和BeanDefinition封装核心方法-refreshBeanFactory()
2021-06-24 23:09:16 0 举报
其实xml解析的目的很简单就是封装成BeanDefinition对象
作者其他创作
大纲/内容
doLoadBeanDefinitions
委托模式
delegate.parseCustomElement
创建XmlBeanDefinitionReader对象
loadBeanDefinitions(beanFactory)
返回BeanFactory
DefaultNamespaceHandlerResolver.resolve==>namespaceHandler.init()init方法中完成标签元素解析类的注册【会维护一个标签和解析标签所用的类的映射关系】NamespaceHandler 这里体现了SPI的思想
2、解析bean标签的属性,如id,name,class,scope,init-method,destroy-method,lazy-init,parent,abstract,primary并把解析出来的属性设置到BeanDefinition对象中
1、doRegisterBeanDefinitions
2、根据bean的子标签,形如:<aop:scoped-proxy/>对BeanDefinitionHolder装饰
3、解析bean中的meta标签
loadBeanDefinitions
该方法功能不重要,设计模式重点看一下,装饰者设计模式,加上SPI设计思想
委托给Reader进行xml解析
把流对象封装成InputSource对象,这个是JDK中的sax解析对象
解析xml,并把xml中的标签封装成BeanDefinition对象
BeanDefinitionParserDelegate
1、doLoadDocument
1、parseBeanDefinitionElement
registerBeanDefinitions
registerBeanDefinition
如果没有命名空间,则属于默认标签
AbstractRefreshableApplicationContext
有命名空间
getBeanFactory()
从Resource对象中获取文件流对象
2、registerBeanDefinitions
4、解析bean中的lookup-method标签包装成LookupOverride
7、解析bean中的property标签封装成MutablePropertyValues
6、解析bean中的constructor-arg标签封装成ConstructorArgumentValues
AbstractApplicationContext.obtainFreshBeanFactory
5、解析bean中的replaced-method标签包装成ReplaceOverride在不改变原有方法的基础上进行增强
AbstractBeanDefinitionReader
3、根据namespaceUri从映射关系中获取NamespaceHandler处理类
4、processBeanDefinition
自定义标签解析
MethodOverride
DefaultListableBeanFactory
2、decorateBeanDefinitionIfRequired
最后对生成的BeanDefinition进行封装成BeanDefinitionHolder对象,里面有两个属性,一个是BeanName,一个是BeanDefinition
ClassPathBeanDefinitionScanner扫描指定包下的所有类,维护要解析的注解到includeFilters集合里,里面包括默认的注解也包括自定义的注解。在doScan之前该集合就维护好了
AbstractXmlApplicationContext
1、创建GenericBeanDefinition对象
DefaultBeanDefinitionDocumentReader
refreshBeanFactory()
XmlBeanDefinitionReader
字符串类型的xml文件路径,转换成Resource对象,这里涉及到模糊匹配,形如:classpath*:user/**/*-context.xml
3、parseDefaultElement
parseBeanDefinitionElement
创建BeanDefinitionDocumentReader对象,专门负责解析Document对象。委托模式
根据InputSource,通过JDK的SAX解析,生成Document对象
2、加载META-INF/spring.handlers配置文件,建立映射关系
1、获取标签的namespaceUri
loadBeanDefinitions( encodedResource)
默认标签解析,如import,bean,alias等 自定义标签即有前缀的标签解析,如context:component-scan等
2、parseBeanDefinitions 对入口节点的document对象进行解析
4、调用NamespaceHandler的init方法完成标签解析类的注册,将要解析的标签和解析处理类放到解析处理类的Map里
xml解析器对象,这里用到了委托模式
0 条评论
下一页