当前位置: 首页 > news >正文

Spring IOC源码篇七 核心方法obtainFreshBeanFactory自定义标签

Spring扩展点-自定义XML标签

    • 1.XML标签解析流程回顾
    • 2.自定义标签流程
    • 3.编写标签类
    • 4.编写标签NamespaceHandler类
    • 5.编写标签解析BeanDefinitionParser类
    • 6.在resources目录下创建META-INF目录
    • 7.META-INF目录下创建自定义标签XSD文件(约束自定义标签)
    • 8.META-INF目录下创建spring.schemas文件(定义schemaLocation与XSD文件映射)
    • 9.META-INF目录下创建spring.handlers文件(定义namespace与NamespaceHandler映射)
    • 10.编写bean定义配置类
    • 11.编写测试类
    • 12.测试结果(打完收工)

1.XML标签解析流程回顾

1.获取标签namespace URI
2.加载META-INFO下spring.handlers文件中定义的namespace与NamespaceHandler映射关系
3.根据namespace URI获取对应NamespaceHandler类
4.实例化对应NamespaceHandler
5.调用NamespaceHandler.init方法
6.在NamespaceHandler.init方法中注册对应标签的解析器BeanDefinitionParser
7.调用对应的解析器解析对应的标签
8.将解析得到的BeanDefinition注册到容器中

2.自定义标签流程

1.编写标签类
2.编写标签NamespaceHandler类
3.编写标签解析BeanDefinitionParser类
4.在resources目录下创建META-INF目录
5.META-INF目录下创建自定义标签XSD文件(约束自定义标签)
6.META-INF目录下创建spring.schemas文件(定义schemaLocation与XSD文件映射)
7.META-INF目录下创建spring.handlers文件(定义namespace与NamespaceHandler映射)
8.编写bean定义配置类
9.编写测试类

3.编写标签类

public class User {private String username;private String phone;private String address;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

4.编写标签NamespaceHandler类

public class UserNamespaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {registerBeanDefinitionParser("user", new UserBeanDefinitionParser());}
}

5.编写标签解析BeanDefinitionParser类

public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {@Overrideprotected Class<?> getBeanClass(Element element) {return User.class;}@Overrideprotected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {String username = element.getAttribute("username");String phone = element.getAttribute("phone");String address = element.getAttribute("address");if(StrUtil.isNotEmpty(username)){builder.addPropertyValue("username", username);}if(StrUtil.isNotEmpty(phone)){builder.addPropertyValue("phone", phone);}if(StrUtil.isNotEmpty(address)){builder.addPropertyValue("address", address);}}
}

6.在resources目录下创建META-INF目录

在这里插入图片描述

7.META-INF目录下创建自定义标签XSD文件(约束自定义标签)

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:tns="http://www.yuriy.com/schema/tag"targetNamespace="http://www.yuriy.com/schema/tag"elementFormDefault="qualified"><xsd:element name="user"><xsd:complexType><xsd:attribute name="id" type="xsd:string"/><xsd:attribute name="username" type="xsd:string"/><xsd:attribute name="phone" type="xsd:string"/><xsd:attribute name="address" type="xsd:string"/></xsd:complexType></xsd:element>
</xsd:schema>

8.META-INF目录下创建spring.schemas文件(定义schemaLocation与XSD文件映射)

http\://www.yuriy.com/schema/tag/user.xsd=META-INF/user.xsd

9.META-INF目录下创建spring.handlers文件(定义namespace与NamespaceHandler映射)

http\://www.yuriy.com/schema/tag=com.sctelcp.bigdata.spring.tag.UserNamespaceHandler

10.编写bean定义配置类

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:model="http://www.yuriy.com/schema/tag"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.yuriy.com/schema/taghttp://www.yuriy.com/schema/tag/user.xsd"><model:user id="1" username="root" phone="123456" address="四川省成都市龙泉驿区大面镇"/>
</beans>

11.编写测试类

public class Main {/**** @param args*/public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application-beans.xml");User user = context.getBean(User.class);System.out.println(user.getAddress());}
}

12.测试结果(打完收工)

在这里插入图片描述

http://www.dtcms.com/a/428075.html

相关文章:

  • 在哪里找做网站的客户郴州网络营销
  • 产生式规则对人工智能中自然语言处理深层语义分析的影响与启示研究
  • 南宁专业网站开发潍坊市网站制作
  • 网站后台登录密码修改自己网站做问卷调查
  • 在命令提示符页面中用pip命令行安装Python第三方库的详细步骤
  • 杭州开发网站的公司网站默认中文字体
  • 深度解析Epoch:模型训练中的“时间与泛化“博弈
  • MySQL索引特性(重点)
  • 【有序数组去重】2022-11-25
  • 【11408学习记录】考研数学线性代数精讲:矩阵方程求解与秩的深度解析
  • 专业沈阳网站制作大数据公司排名
  • 做受视频网站现在流行什么语言建设网站
  • TDengine 时序函数 STATEDURATION 用户手册
  • Java-Spring入门指南(十二)SpringAop的三种实现方式
  • 网站在线统计代码cms开发框架
  • CometD 长轮询协议及在Salesforce中的应用
  • 企术建站网站收录查询主要由哪几个网站
  • 中小型网站建设与网络搭建教育机构加盟
  • 重庆职业能力建设投稿网站网站正能量免费推广软件晚上
  • LeetCode 114. 二叉树展开为链表
  • 网站性能优化电子商务网站建设与管理期末答案
  • 橙色网站设计手机社区网站模板
  • ns3 配置 Ubuntu × CLion
  • 大模型——长文拆解上下文工程落地策略与实践
  • 网站免费建站pixiv appdw如何在网站做弹窗
  • 分身宝 1.0.8 | 无限多开系统级分身~更稳定安全支持同时登录多个社交软件、游戏账号,互不干扰,操作简单便捷,一键切换
  • 网站服务器租用价格 贴吧磁力神器
  • 山东seo推广网站建设个人网站推广方案
  • 商务网站建设工程师是做网站找俊义 合优
  • 简要介绍IDM(Internet Download Manager)的功能及其在下载管理领域的地位