也就说 , 这个标签是可以扩展的 。
话不多说 , 来个扩展
接下来自定义命名空间 , 总共分为3步 。
第一步:定义一个xsd文件
如下:
xmlns:xsd=“”
=“”>
这个xsd文件来指明这个命名空间下有哪些标签和属性 。这里我只指定了一个标签 , 标签里面有个class的属性 , 然后这个标签的目的就是将class属性指定的Bean的类型 , 注入到容器中 , 作用跟的 标签的作用是一样的 。
xsd文件没有需要放的固定的位置 , 这里我放到 META-INF 目录下
第二步:解析这个命名空间
解析命名空间很简单 , 都有配套的东西–接口 , 只要实现这个接口就行了 。但一般我们不直接实现接口 , 我们可以继承 ort 类 , 这个类实现了接口 。
class erort {
@Overridepublic void init() {//注册解析 mybean 标签的解析器registerBeanDefinitionParser("mybean", new SanYouBeanDefinitionParser());}private static class SanYouBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {@Overrideprotected boolean shouldGenerateId() {return true;}@Overrideprotected String getBeanClassName(Element element) {return element.getAttribute("class");}}
}
er的作用就是将命名空间中的这个标签读出来 , 拿到class的属性 , 然后将这个class属性指定的class类型注入到容器中 , 至于注册这个环节的代码 , 都交给了的父类来做了 。
第三步:创建并配置.和.文件
先创建.和.文件
.文件内容
通过.配置文件 , 就知道命名空间应该找er进行解析
.文内容
.配置xsd文件的路径
文件都有了 , 只需要放到下的META-INF文件夹就行了 。
xsd、.、.文件
到这里 , 就完成了扩展 , 接下来进行测试
测试
先构建一个.xml文件 , 放到目录下
再写个测试类
class{
public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");applicationContext.refresh();User user = applicationContext.getBean(User.class);System.out.println(user);}
}
运行结果:
1
com....User@
成功获取到User这个对象 , 说明自定义标签生效了 。
内置命名空间的扩展
的实现
通过接口的这些实现类的命名就可以看出来有哪些扩展和这些扩展的作用 , 比如有处理aop的 , 有处理mvc的等等之类的 。
开源框架对命名空间的扩展
1、的扩展
的实现
这个就是来扫描指定路径的接口的 , 处理 scan 标签 , 跟@注解的作用是一样的 。
2、dubbo的扩展
使用dubbo可能写过如下的配置
1
这个dubbo命名空间肯定就是扩展的的 , 也有对应的dubbo实现的 。
r
不得不说 , dubbo解析的标签可真的多啊 , 不过功能也是真的多 。
总结
到这 , 本文就接近尾声了 , 这里画两张图来总结一下本文讲了的哪些扩展点 。
整体
启动扩展点
通过学习的这些扩展点 , 既可以帮助我们应对日常的开发 , 还可以帮助我们更好地看懂的源码 。
- 三万字盘点Spring/Boot的那些常用扩展点
- 盘点7个高性价比皮带品牌,简洁百搭广受欢迎 中国皮带十大名牌
- 盘点古代史上30大惊人酷刑:割喉剖腹太吓人了!
- 盘点中国历史上八个奇葩兵器,第四个让人闻风丧胆!
- 盘点西游记中最好看的女妖精到底是谁。 世界之最妖精
- 盘点历史上的6大天灾,日本地震没资格上榜,乌克兰饥荒差点灭国 世界之最黑死病
- 世界上最著名的十把步枪盘点 世界之最步枪
- 清朝吃货大盘点:大学士纪晓岚也是大胃王
- 盘点三国中那些被秒杀的武将:潘凤最惨
- 闻香识女人,盘点世界经典十大香水品牌 世界十大奇迹香水