命名空间
Spring XML 命名空间是一种用于定义和组织 XML 配置文件结构的机制,它允许在 XML 文件中引入特定命名空间以使用特定功能。通过引入命名空间,可以使用该命名空间所提供的标签和属性来配置 Spring 框架中的不同功能和组件。
在 Spring XML 配置文件中,命名空间通常通过 xmlns
属性来声明,例如 xmlns:context
、xmlns:mvc
等。这些命名空间引入了特定功能的标签和属性,使得配置文件能够更加清晰地表达各种配置信息。
每个命名空间都有其独特的功能和对应的标签,例如 context
命名空间用于处理 Spring 应用上下文相关的配置,mvc
命名空间用于配置 Spring MVC 相关的组件,tx
命名空间用于配置事务管理等。
通过引入命名空间,Spring XML 配置文件可以更加模块化和可读性更强,使得配置更加灵活和清晰。在配置文件中,可以根据需要选择引入特定命名空间,并使用相应的标签和属性来配置 Spring 应用的各个方面。
Spring 配置文件
不引入任何命名空间的 Spring 配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" name="u;USER" class="world.xuewei.entity.User">
<property name="userName" value="薛伟"/>
<property name="password" value="123456"/>
</bean>
</beans>
引入了其他命名空间的 Spring 配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean id="user" name="u;USER" class="world.xuewei.entity.User">
<property name="userName" value="薛伟"/>
<property name="password" value="123456"/>
</bean>
<mvc:annotation-driven/>
</beans>
自定义命名空间
我们就以上面的 User 为例,开发一个自定义的命名空间。然后我们可以使用 <xw:user>
来定义 User Bean。
创建 META-INF
在 resources 目录下创建 META-INF 文件夹。
定义标签约束模板
在刚刚创建的 META-INF 文件夹中新建文件 user.xsd
。
注意:这里的 id 属性是必须的!
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://xuewei.world/schema/user"
elementFormDefault="qualified">
<element name="user">
<complexType>
<attribute name="id" type="string"/>
<attribute name="userName" type="string"/>
<attribute name="password" type="string"/>
</complexType>
</element>
</schema>
创建 spring.schemas
在刚刚创建的 META-INF 文件夹中新建文件 spring.schemas
。
http\://xuewei.world/schema/user.xsd=META-INF/user.xsd
修改 Spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xw="http://xuewei.world/schema/user"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://xuewei.world/schema/user http://xuewei.world/schema/user.xsd">
<xw:user id="user" userName="薛伟" password="123456"/>
</beans>
可以看到,这里就可以成功引入我们自己定义的约束了!但是现在去运行肯定是会报错的,因为我们还没有创建 Handler。
我们可以运行一下,看看是报什么错。
创建 UserNamespaceHandler 类
package world.xuewei.handler;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
/**
* 用户命名空间处理
*
* @author 薛伟
*/
public class UserNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
}
}
创建 UserBeanDefinitionParser 类
package world.xuewei.handler;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
import world.xuewei.entity.User;
/**
* 用户 Bean 节点解析器
*
* @author 薛伟
*/
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return User.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
String userName = element.getAttribute("userName");
String password = element.getAttribute("password");
builder.addPropertyValue("userName", userName);
builder.addPropertyValue("password", password);
}
}
创建 spring.handlers
在刚刚创建的 META-INF 文件夹中新建文件 spring.schemas
。
http\://xuewei.world/schema/user=world.xuewei.handler.UserNamespaceHandler
测试程序
@Test
public void testDefaultListableBeanFactory() {
// 创建工厂
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// 创建 XML 阅读器,并指定关联的工厂
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
// 开始解析加载 Bean
reader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
System.out.println(factory.getBean("user"));
}