上文已经翻译大神的文档了,现在我分析一下,照葫芦画瓢也自己定义命名空间处理器玩一玩
1、分析关系
-
现在我们有xml标签文件,schema文件,java文件怎么进行关联,怎么关系
-
-
进一步放大
- 1、beans.xml 它怎么知道约束它schema?
- 主要是位于beans属性中xsi:schemaLocation中有配置 http://www.codelooru.com/custns.xsd
- 它关联到 spring.schemas中属性配置文件,然后这个配置将这个url指向本工程的schema.xsd文件。(当然看schemas后面的s说明可以配置多个对应关系)
- 这样beans.xml就可以找到shema文件,同时schema也要知道自己约束命名空间那个?所以它也有targetNamespace属性配置
- 2、schema的对应处理器,spring是如何知道呢?
- 主要是位于beans属性中xsi:schemaLocation中有配置 http://www.codelooru.com/custns
- 它关联到 spring.handlers中属性配置文件,然后这个配置将这个url指向本工程对应处理器(当然看handlers后面的s说明可以配置多个对应关系)
- 其实spring应该可以知道这个处理器是哪一个,因为beans.xml已经告诉他,我觉得应该是统一管理而不是被动收集,所以我还需要将我自定义处理器注入到spring容器,告诉他,遇到这样命名空间的标签请让我处理,也就是继承NamespaceHandlerSupport抽象类。
- 3、spring又是如何提供接口支持自定义呢?
- 最小职责原则,你不用关心,spring怎么那么xml的对应dom的标签,你只需知道我现在已经拿到这样一个标签,你需要解析标签中元素,然后你做你自定义bean注册工作即可。
- 1、beans.xml 它怎么知道约束它schema?
-
2、总结一下
- 我们是不是可以猜想,其他spring的处理器是不是配置在spring.handlers中,spring会读取这个文件
- 为啥需要spring.schemas文件进行关系配置呢?直接写在beans.xml不是很好吗?
- 应该是解耦关系,那么我想要变更schema的版本,怎么处理呢?如果不是写在配置文件中,那么需要修改所有beans.xml文件
- 方便管理和查看,也就具有可读性和维护性
- 使用场景:如果普通那bean标签不能满足你的要求,或者你想简化你配置,自定义一些模板,也是不错的选择。
- 进一步扩展,当然不限于xml格式文件其他文件和解析功能,比如excel表格呢,是不是可以模板进行约束,创建handler,然后注入handler等步骤,抽象为责任链的一种模式,各司其职,spring源码中也会有大量这样情况,各种handler横行情况
##3、工程示例代码
-
希望对您有所帮助