本节主要讲parseCustomElement 解析自定义标签和扩展自定义标签,找到方法
这里需要注意的是readerContext对象是前面已经实例化了的,createReaderContext方法中创建的,如下图:
我们再看下方法:getNamespaceHandlerResolver,
这里注意看下变量:DEFAULT_HANDLER_MAPPINGS_LOCATION的值:
META-INF/spring.handlers,也就是在这个路径下读取配置文件
这个类中还有两个重要的方法,后续都会用到,getHandlerMappings方法和resolve方法,
resolve方法:
再回到前面:
调用方法resolve获取解析的处理类
执行init方法:
接下来就是解析标签了:
handler.parse(ele, new ParserContext(this.readerContext, this, containingBd))
找到BeanDefinitionParser接口
获取到标签的parser类了,
进入类:
进入具体解析的标签类的方法:doParse方法处理:先执行父类的解析方法,再执行自己的解析方法
解析完标签之后,就是注册BeanDefinition了,进入方法:registerBeanDefinition
最终放入容器中:
下面讲解自定义标签<lyh:user />
1 创建一个对应的解析处理类(在init方法中添加parser类)
2 创建一个普通的spring.handlers配置文件,让应用程序能够完成加载工作
3 创建对应的标签的parser类(对当前标签的其他属性值进行解析工作)
1 新建一个user对象
2 定义UserBeanDefinitionParser解析类,继承AbstractSingleBeanDefinitionParser
3 定义UserNamespaceHandler类
4、在resource目录下创建META-INF目录下,并创建三个文件
4.1 Spring.handlers
http\://www.liyanghao.com/schema/user=com.lyh.selftag.UserNamespaceHandler
4.2 Spring.schemas
http\://www.liyanghao.com/schema/user.xsd=META-INF/user.xsd
user.xsd
5 创建配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lyh="http://www.liyanghao.com/schema/user"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.liyanghao.com/schema/user http://www.liyanghao.com/schema/user.xsd">
<lyh:user id = "user" userName = "lyh" email = "9022@qq.com" password="123456"/>
</beans>
6 编写测试类
7 执行结果:
到这里自定义标签就结束了,spring源码后续知识继续讲解。