在Spring XML配置文件中除了Spring 默认的Namespace,今天我们来看一下如何自定义Namespace
1. Spring自定义XML的Namespace原理
整个Spring容器启动的时候流程还是一样,但是在加载Bean的定义的时候,XML配置文件调用的是 AbstractXmlApplicationContext#loadBeanDefinitions 方法来加载XML中的Bean的定义。然后通过 XmlBeanDefinitionReader 从设置的默认位置或者指定位置的xml解析成为Document到内存。BeanDefinitionDocumentReader 负责解析 XML Document中每个 Element。
整个过程会读取META-INF/spring.schemas文件中配置的Namespace和XSD文件的对应关系进行校验
在解析的过程中会去判断是Spring默认的Namespace还是用户自定义Namespace
-
Spring 默认Element处理
默认的Element: import,alias,bean,beans,这些都是由 DefaultBeanDefinitionDocumentReader 提供默认解析
-
自定义的Element处理
通过获取配置在 META-INF/spring.handlers 文件中对应Namespace的处理类。这个Namespace的处理类实现 NamespaceHandler或者NamespaceHandlerSupport 。
然后调用NamespaceHandler具体实例的NamespaceHandler#parse方法对Element进行解析。
2. Spring自定义XML的Namespace实战
定义一个和Spring默认的bean拥有相同功能的Element,这个Element可以叫:mxsmBean, 具体的步骤如下图:
2.1 XSD定义
通过XSD文件定义mxsmBean需要有哪些属性。
<?xml version="1.0" encoding="UTF-16" ?>
<xsd:schema xmln