Spring Bean加载源码解析
2017-09-15 10:24
447 查看
web.servlet.HttpServletBean.init()
web.servlet.FrameworkServlet.initServletBean()
web.servlet.FrameworkServlet.initWebApplicationContext()
web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac)
context.support.AbstractApplicationContext.refresh()
context.support.AbstractApplicationContext.obtainFreshBeanFactory()
context.support.AbstractRefreshableApplicationContext.refreshBeanFactory()
web.context.support.XmlWebApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
或
web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlBeanDefinitionReader reader)
beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(String location, Set actualResources)
beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(Resource… resources)
beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)
beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(EncodedResource encodedResource)
从EncodedResource中加载BeanDefinition
beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource inputSource, Resource resource)
从InputSource中加载BeanDefinition
1. Document doc = doLoadDocument(inputSource, resource); 获得Document
2. registerBeanDefinitions(doc, resource); 从获得Document加载BeanDefinition
beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(Document doc, Resource resource)
1. BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader(); 获取BeanDefinitionDocumentReader
2. documentReader.registerBeanDefinitions(doc, createReaderContext(resource)); 利用BeanDefinitionDocumentReader加载BeanDefinition
beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(Document doc, XmlReaderContext readerContext)
1. Element root = doc.getDocumentElement(); 获取Document根元素
2. doRegisterBeanDefinitions(root); 从根元素开始加载BeanDefinition
beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(Element root)
1. if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) 根据profile属性和上下文Environment判断是否要加载该Element
2. parseBeanDefinitions(root, this.delegate); 加载root元素
beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)
解析根元素
1. parseDefaultElement(ele, delegate); 解析默认元素
2. delegate.parseCustomElement(ele); 解析csutom元素
beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)
解析默认元素:import alias bean beans
beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)
解析bean元素
beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, BeanDefinition containingBean)
解析bean元素,生成BeanDefinitionHolder对象,该对象包含beanDefinition, beanName, aliasesArray
beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean)
解析bean元素,生成AbstractBeanDefinition
beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(Element ele, BeanDefinition containingBd)
解析Custom命名空间的元素:
1. 根据命名空间URI找到解析器,命名空间URI和解析器的映射关系放在properties文件中。
2. 让解析器解析Element元素,返回BeanDefinition
beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(String namespaceUri)
根据URI解析找到命名空间解析器NamespaceHandler:
web.servlet.FrameworkServlet.initServletBean()
web.servlet.FrameworkServlet.initWebApplicationContext()
web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac)
context.support.AbstractApplicationContext.refresh()
context.support.AbstractApplicationContext.obtainFreshBeanFactory()
context.support.AbstractRefreshableApplicationContext.refreshBeanFactory()
web.context.support.XmlWebApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
或
web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlBeanDefinitionReader reader)
beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(String location, Set actualResources)
beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(Resource… resources)
beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)
beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(EncodedResource encodedResource)
从EncodedResource中加载BeanDefinition
beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource inputSource, Resource resource)
从InputSource中加载BeanDefinition
1. Document doc = doLoadDocument(inputSource, resource); 获得Document
2. registerBeanDefinitions(doc, resource); 从获得Document加载BeanDefinition
beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(Document doc, Resource resource)
1. BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader(); 获取BeanDefinitionDocumentReader
2. documentReader.registerBeanDefinitions(doc, createReaderContext(resource)); 利用BeanDefinitionDocumentReader加载BeanDefinition
beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(Document doc, XmlReaderContext readerContext)
1. Element root = doc.getDocumentElement(); 获取Document根元素
2. doRegisterBeanDefinitions(root); 从根元素开始加载BeanDefinition
beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(Element root)
1. if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) 根据profile属性和上下文Environment判断是否要加载该Element
2. parseBeanDefinitions(root, this.delegate); 加载root元素
beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)
解析根元素
1. parseDefaultElement(ele, delegate); 解析默认元素
2. delegate.parseCustomElement(ele); 解析csutom元素
beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate)
解析默认元素:import alias bean beans
beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)
解析bean元素
beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, BeanDefinition containingBean)
解析bean元素,生成BeanDefinitionHolder对象,该对象包含beanDefinition, beanName, aliasesArray
beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean)
解析bean元素,生成AbstractBeanDefinition
beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(Element ele, BeanDefinition containingBd)
解析Custom命名空间的元素:
1. 根据命名空间URI找到解析器,命名空间URI和解析器的映射关系放在properties文件中。
2. 让解析器解析Element元素,返回BeanDefinition
beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(String namespaceUri)
根据URI解析找到命名空间解析器NamespaceHandler:
Map<String, Object> handlerMappings = getHandlerMappings();遍历所有properties文件,查找解析器
相关文章推荐
- Spring源码解析之Bean的加载
- 分析spring源码第五(三)篇:Spring中Bean的解析、加载、创建 过程总结
- Spring源码解析笔记4——bean的加载
- spring容器初始化,bean加载生成过程,源码解析学习
- Spring源码解析-bean的加载
- Spring源码解析:简单容器中Bean的加载过程初探
- Spring源码阅读之Bean加载(annotation )2
- 【Spring源码从入门到精通】(八)解析及注册BeanDefinitions
- spring Ioc源码解读-xml资源加载与解析
- Spring bean定义解析源码分析
- Spring源码分析:非懒加载的单例Bean初始化前后的一些操作
- spring bean加载源码
- spring源码学习(六)Bean的加载(中)
- Spring源码学习--Bean注入解析结果BeanDefinition
- 【spring】源码解析之 DefaultListableBeanFactory 和 XmlBeanDefinitionReader
- Spring源码(一)——Bean加载过程
- 【Spring源码分析系列】加载Bean
- spring源码解读-加载解析配置文件
- 【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)
- Spring之bean加载源码阅读工程搭建