Spring执行流程
2023-06-11 23:38:26 0 举报
Spring执行流程-解析XML注册BeanFactory
作者其他创作
大纲/内容
AbstractApplicationContext
Y
结果 == null
loadBeanDefinitions(beanFactory);初始化documentReader对XML进行加载和解析
执行ClassPathXmlApplicationContext构造函数
obtainFreshBeanFactory()创建BeanFactory容器
为对象设置Environment属性(Environment为null则创建一个新的)
通过DocumentBuilderFactory创建DocumentBuilder,将配置文件解析后封装成Document对象,后面会对Document中获取xml的各个节点属性
设置ResourceLoader属性(ClassPathXmlApplicationContext)
new PropertyPlaceholderHelper帮助解析配置文件属性包含${,},:等
Y return null
setParent
this
在DocumentLoader中
设置EntityResolver属性加载本地dtd文件和xsd文件,用来对xml配置文件进行规范
创建对象用来解析XML配置文件new PathMatchingResourcePatternResolver
doRegisterBeanDefinitions(Element root)具体的解析方法,参数是Document中的root Element(<beans>)
遍历数组形式配置文件
parseBeanDefinitionAttributes(方法重写)解析标签中scope、lazy-init、depends-on等多重属性并对GenericBeanDefinition进行初始化赋值
N
currentResources是在用ThreadLocal包装的resourcesCurrentlyBeingLoaded中获取
父类构造方法
registerBeanDefinitions(Doc,Resource)创建BeanDefinitionDocumentReader对象解析Doc对象
parseBeanDefinitionElement(方法重写)获取class属性(类的全限定名)
parseStringValue()如果配置文件名中包含占位符,则根据获取到的System.property中对应属性值进行替换
从EncodeResource中获取Resource并转换成InputStream
如果root标签中namespaceUri属性 = http://www.springframework.org/schema/beans则获取profile属性(Spring中一般不会配置profile)
parent != null则创建Environment对象
如果Environment为null,则new StandardEnvironment
根据beanName在beanDefinitionMap(ConcurrentHahsfont color=\"#323232\
设置XmlBeanDefinitionReader对象属性
创建一个XmlBeanDefinitionReader,并将beanFactory设为registry属性
loadBeanDefinitions()完成beanDefinitions对象加载。
创建DocumentBuilderFactory,如果采用xsd验证方式,则设置http://java.sun.com/xml/jaxp/properties/schemaLanguage和http://www.w3.org/2001/XMLSchema
ApplicationContext ac = new ClassPathXmlApplicationContext(\"applicationContext.xml\");
依次解析meta、lookup-method、replaced-method、constructor-arg等<bean>下的所有属性、标签并设置到GenericBeanDefinition中
return GenericBeanDefinition
如果是Spring中默认标签(<beans>、<inport>、<bean>)、<alias>
获取ResourceLoader对象
如果包含,则调用getResource获取资源具体定位
以String[]方式获取配置文件资源路径-getConfigLocations
customizeBeanFactory(beanFactory)设置allowBeanDefinitionOverriding(是否允许bean被覆盖,默认为true)和allowCircularReferences(是否允许bean被依赖,默认为false)
return new BeanDefinitionHolder()
resourceLoader instanceof ResourcePatternResolver
GenericBeanDefinition == null
以Resource[]方式获取配置文件资源路径-getConfigResource
refresh()
设置序列化ID,可以根据ID进行反序列化beanFactory对象
返回Document对象
如果beanName == null,则根据Spring提供的命名规则生成beanName
看allowBeanDefinitionOverriding属性是否为false,如果为false则抛异常
用currentResources来记录加载过的配置文件
Y- 解析Bean标签为例
创建BeanDefinitionParserDelegate对象,
结束
prepareRefresh()设置容器启动时间、容器激活标志位=true,容器关闭标志位=false创建Environment对象、创建并获取环境对象、准备监听器和事件集合对象
根据绝对路径获取配置文件具体位置
父类构造器
创建GenericBeanDefinition
initBeanDefinitionReader()设置配置文件是否需要验证
父类构造器初始化忽略要依赖接口
doLoadBeanDefinitions核心处理步骤
调用CPXAC的super()初始化操作
setConfigLocations(String... locations)根据参数String[]中多个配置文件给定路径
判断xml文件名前缀是否以classpath*:、war:、*/开头
parseBeanDefinitionElement解析bean标签中name、id属性,有别名设置别名,并检查name的唯一性。
将Resource包装成encodeResource
loadBeanDefinitions(resource)加载获取到的配置文件xml
refreshBeanFactory()如果存在beanFactory则进行销毁,并创建新的DefaultListableBeanFactory
收藏
收藏
0 条评论
下一页