1 工程概述
1.1 pom文件
<properties> <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> <maven测试数据piler.source> 1.8 </maven测试数据piler.source> <maven测试数据piler.target> 1.8 </maven测试数据piler.target> <spring.version> 5.2.8.RELEASE </spring.version> </properties> <dependencies> <dependency> <groupId> junit </groupId> <artifactId> junit </artifactId> <version> 4.13 </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-context </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.projectlombok </groupId> <artifactId> lombok </artifactId> <version> 1.16.20 </version> </dependency> <!-- 日志相关依赖 --> <dependency> <groupId> org.slf4j </groupId> <artifactId> slf4j-api </artifactId> <version> 1.7.10 </version> </dependency> <dependency> <groupId> ch.qos.logback </groupId> <artifactId> logback-classic </artifactId> <version> 1.1.2 </version> </dependency> <dependency> <groupId> ch.qos.logback </groupId> <artifactId> logback-core </artifactId> <version> 1.1.2 </version> </dependency> </dependencies>1.2 applicationContext.xml
<beans xmlns = "http://HdhCmsTestspringframework.org/schema/beans" xmlns:xsi = "http://HdhCmsTestw3.org/2001/XMLSchema-instance" xmlns:context = "http://HdhCmsTestspringframework.org/schema/context" xsi:schemaLocation = " http://HdhCmsTestspringframework.org/schema/beans http://HdhCmsTestspringframework.org/schema/beans/spring-beans.xsd http://HdhCmsTestspringframework.org/schema/context http://HdhCmsTestspringframework.org/schema/context/spring-context.xsd" default-lazy-init = "false" > <bean id = "student" class = "com.rosh.bean.StudentBean" /> <context:component-scan base-package = "com.rosh.service" /> </beans>1.3 StudentBean
@Data @AllArgsConstructor @NoArgsConstructor @ToString public class StudentBean { private String name = "rosh" ; private String school = "杜桥中学" ; private String hobby = "篮球" ; }1.4 RoshTest
public class RoshTest { @Test public void mainTest (){ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext ( "applicationContext.xml" ); StudentBean student = applicationContext . getBean ( StudentBean . class ); System . out . println ( student . toString ()); } }1.5 运行结果
2 流程解析
2.1 源码Debug
描述 :调用构造方法中的refresh方法
描述 :调用AbstractApplicationContext refresh()方法进行xml解析
重点: 创建XML对象的解析器
重点: 用xml文件解析器把xml文件转换成Reource对象
重点: Resource对象转Document对象
**重点:**创建Document解析器
总结: DefaultBeanDefinitionDocumentReader(Document解析器)解析xml文件
2.2 总结流程
大概步骤:
(1) 构造。
(2) 刷新工厂。
(3) 创建xml对象解析器。
(4) 将xml解析成Resource对象。
(5) Resource转Document。
(6) 创建Document对象解析器。
(7) 解析Document对象。
详细步骤:
1 ClassPathXmlApplicationContext 调用构造方法。 2 AbstractApplicationContext : ( 1 ) 调用 refresh ()方法。 ( 2 ) 调用 obtainFreshBeanFactory ()方法。 3 AbstractRefreshableApplicationContext 调用 refreshBeanFactory () 方法。 4 AbstractXmlApplicationContext : ( 1 ) loadBeanDefinitions ( DefaultListableBeanFactory beanFactory )方法。创建 XML 解析器。 ( 2 ) 调用 loadBeanDefinitions ( XmlBeanDefinitionReader reader )方法。 5 AbstractBeanDefinitionReader : ( 1 ) loadBeanDefinitions ( String ... locations )方法。 ( 2 ) loadBeanDefinitions ( String location )方法。 ( 3 ) loadBeanDefinitions ( String location , @Nullable Set < Resource > actualResources )方法,将 XML 解析成 Resource 对象。 ( 4 ) loadBeanDefinitions ( Resource ... resources )方法。 6 XmlBeanDefinitionReader : ( 1 ) loadBeanDefinitions ( Resource resource ) 方法。 ( 2 ) loadBeanDefinitions ( EncodedResource encodedResource ) 方法。 ( 3 ) doLoadBeanDefinitions ( InputSource inputSource , Resource resource )方法。 ( 4 ) registerBeanDefinitions ( Document doc , Resource resource )方法。创建 Document 解析器。 7 DefaultBeanDefinitionDocumentReader : ( 1 ) registerBeanDefinitions ( Document doc , XmlReaderContext readerContext )方法。 ( 2 ) doRegisterBeanDefinitions ( Element root )方法。 ( 3 ) parseBeanDefinitions ( Element root , BeanDefinitionParserDelegate delegate ) 方法解析默认标签、自定义标签。3 解析Bean标签
4 自定义标签解析
4.1 步骤
1. 获取自定义标签的 namespace 命令空间,例如:http://HdhCmsTestspringframework.org/schema/context
2. 根据命令空间获取 NamespaceHandler 对象通过 SPI 机制获取 spring 中所有 jar 包里面的 "META-INF/spring.handlers"
文件,并且建立映射关系
3. 反射获取 NamespaceHandler 实例
4. 调用对应标签如 ContextNameHandler 标签的 init()方法
5. 调用 handler.parse()方法完成解析
4.2 流程解析
1 根据自定义标签寻找相应的uri
2 加载spring中全部MET-INF/spring.handlers
3 根据applicationContext.xml 找对应的Hadnler
4.3 Debug
总结
到此这篇关于Spring中Xml属性配置解析的文章就介绍到这了,更多相关Spring Xml属性配置解析内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
原文链接:https://blog.csdn.net/qq_34125999/article/details/114740545
查看更多关于Spring中Xml属性配置的解析全过程记录的详细内容...