java 自定义xml_6.1 如何在spring中自定义xml标签

dubbo自定义了很多xml标签,例如,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子。

7326872bebd2fb2dad48cf877949b702.png

一 编写模型类

1 packagecom.hulk.testdubbo.model;2

3 public classHero {4 privateString name;5 private intage;6

7 publicString getName() {8 returnname;9 }10

11 public voidsetName(String name) {12 this.name =name;13 }14

15 public intgetAge() {16 returnage;17 }18

19 public void setAge(intage) {20 this.age =age;21 }22 }

二 定义xsd文件

1

3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"

4 targetNamespace="http://hulk.com/schema">

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

说明:

定义targetNamespace(目标命名空间),xmlns的值要与这个相同

xsd:element定义的就是将来会在xml文件中用到的元素,例如中的application

xsd:attribute定义的就是模型类中的属性,例如中的name,并且可以指定属性类型,进而起到检测的作用(当我们定义的是int,如果在xml中的值是非int型的,直接会报错)。

三 编写spring.schemas

作用:该文件用来指定xsd文件的位置。

http\://hulk.com/schema/hero.xsd=META-INF/hero.xsd

注意:红色部分要与xsd文件中的targetNamespace相同。

四 编写BeanDefinition解析器

作用:主要用来解析自定义的xml标签。

1 packagecom.hulk.testdubbo.schema;2

3 importorg.springframework.beans.factory.config.BeanDefinition;4 importorg.springframework.beans.factory.support.BeanDefinitionRegistry;5 importorg.springframework.beans.factory.support.RootBeanDefinition;6 importorg.springframework.beans.factory.xml.BeanDefinitionParser;7 importorg.springframework.beans.factory.xml.ParserContext;8 importorg.w3c.dom.Element;9

10 public class HeroBeanDefinitionParser implementsBeanDefinitionParser {11 private final Class>beanClass;12

13 public HeroBeanDefinitionParser(Class>beanClass) {14 this.beanClass =beanClass;15 }16

17 publicBeanDefinition parse(Element element, ParserContext parserContext) {18 RootBeanDefinition beanDefinition = newRootBeanDefinition();19 beanDefinition.setBeanClass(beanClass);20 beanDefinition.setLazyInit(false);21 beanDefinition.getPropertyValues().add("name", element.getAttribute("name"));22 beanDefinition.getPropertyValues().add("age", element.getAttribute("age"));23 BeanDefinitionRegistry beanDefinitionRegistry =parserContext.getRegistry();24 beanDefinitionRegistry.registerBeanDefinition(beanClass.getName(),beanDefinition);//注册bean到BeanDefinitionRegistry中

25 returnbeanDefinition;26 }27 }

五 编写命名空间处理器

作用:主要用来注册BeanDefinition解析器。

1 packagecom.hulk.testdubbo.schema;2

3 importcom.hulk.testdubbo.model.Hero;4 importorg.springframework.beans.factory.xml.NamespaceHandlerSupport;5

6 public class HeroNamespaceHandler extendsNamespaceHandlerSupport {7 public voidinit() {8 registerBeanDefinitionParser("elementname1", new HeroBeanDefinitionParser(Hero.class));9 }10 }

说明:通常为每一个xsd:element都要注册一个BeanDefinitionParser。

六 编写spring.handlers文件

作用:主要用于关联命名空间处理器和xsd中的targetNamespace。

http\://hulk.com/schema=com.hulk.testdubbo.schema.HeroNamespaceHandler

说明:key是xsd文件中的targetNamespace。

七 测试 - 编写hero.xml

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4 xmlns:hero="http://hulk.com/schema"

5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd6 http://hulk.com/schema http://hulk.com/schema/hero.xsd">

7

8

说明:

xmlns:hero的value是xsd文件中的targetNamespace。

xmlns:hero可以写成xmlns:xxx,此时就要写成

八 测试 - 编写测试主类

1 packagecom.hulk.testdubbo.test;2

3 importcom.hulk.testdubbo.model.Hero;4 importorg.springframework.context.ApplicationContext;5 importorg.springframework.context.support.ClassPathXmlApplicationContext;6

7 public classMain {8 public static voidmain(String[] args) {9 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("hero.xml");10 Hero hero = (Hero) applicationContext.getBean(Hero.class.getName());11 System.out.println("name: " + hero.getName() + " age: " +hero.getAge());12 }13 }

如何在spring中自定义xml标签的方法就结束了。在实际中,随着注解和javaconfg的盛行,xml的方式渐渐的会淡出舞台,但是spring的启动流程还是会的。来看一下上述代码涉及到的流程。

使用ResourceLoader将配置文件xml装载为Resource对象;

使用BeanDefinitionReader解析配置信息:将每一个解析为一个BeanDefinition对象,然后存储到BeanDefinitionRegistry中

实际上是BeanDefinitionReader调用BeanDefinitionParser进行了解析操作,解析完成后注册到BeanDefinitionRegistry(代码看上边的HeroBeanDefinitionParser)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值