Spring自定义标签
Spring支持对自定义标签
自定义spirng配置文件标签实现以下效果:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mrpc="http://blog.csdn.net/pretent/schema/mnm"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://blog.csdn.net/pretent/schema/mnm
http://blog.csdn.net/pretent/schema/mnm.xsd">
<mnm:annotation package="server.impl" />
</beans>
定义约束文件xsd
需要在资源目录中/src/main/resources/META-INF/建立xsd文件
<xsd:schema xmlns="http://blog.csdn.net/pretent/schema/mnm"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://blog.csdn.net/pretent/schema/mnm"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="annotation">
<xsd:complexType>
<xsd:attribute name="package" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
指定XSD文件位置
需要在资源目录中建立/src/main/resources/META-INF/spring.schemas文件
http\://blog.csdn.net/pretent/schema/mnm.xsd=META-INF/mnm.xsd
指定自定义标签处理程序
需要在资源目录中建立/src/main/resources/META-INF/spring.handlers文件
http\://blog.csdn.net/pretent/schema/mnm=org.pretent.mrpc.support.handler.MnmNamespaceHandler
指定标签解析器
org.pretent.mrpc.support.handler.MnmNamespaceHandler
package org.pretent.mrpc.support.handler;
import org.pretent.mrpc.support.config.AnnotationConfig;
import org.pretent.mrpc.support.parer.MnmBeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MrpcNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("annotation", new MnmBeanDefinitionParser(AnnotationConfig.class));
}
}
标签解析器
org.pretent.mrpc.support.parer.MnmBeanDefinitionParser
package org.pretent.mrpc.support.parer;
import org.pretent.mrpc.support.bean.ImplProxyBean;
import org.pretent.mrpc.support.bean.RegisterBean;
import org.pretent.mrpc.support.config.AnnotationConfig;
import org.pretent.mrpc.support.config.ProtocolConfig;
import org.pretent.mrpc.support.config.ReferenceConfig;
import org.pretent.mrpc.support.config.ServiceConfig;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
/**
* AbstractSingleBeanDefinitionParser
*
* @author pretent
*/
public class MnmBeanDefinitionParserimplements BeanDefinitionParser {
private Class<?> clazz;
public MnmBeanDefinitionParser(Class<?> clazz) {
this.clazz = clazz;
}
public BeanDefinition parse(Element element, ParserContext parserContext) {
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setLazyInit(false);
String id = element.getAttribute("id");
if (AnnotationConfig.class.equals(clazz)) {
beanDefinition.setBeanClass(clazz);
String packageName = element.getAttribute("package");
beanDefinition.getPropertyValues().add("packageName", packageName);
}
if ((id == null || id.length() == 0)) {
String name = element.getAttribute("name");
if (name == null || name.length() == 0) {
name = clazz.getName();
}
id = name;
}
parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
return beanDefinition;
}
}
org.pretent.mrpc.support.config.AnnotationConfig
package org.pretent.mrpc.support.config;
public class AnnotationConfig {
private String packageName;
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
}
使用
Spring 配置文件/src/main/resources/application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mrpc="http://blog.csdn.net/pretent/schema/mnm"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://blog.csdn.net/pretent/schema/mnm
http://blog.csdn.net/pretent/schema/mnm.xsd">
<bean id="orderService" class="server.impl.OrderServiceImpl" />
<mnm:annotation package="server.impl" />
</beans>
这样就可以直接<mnm:annotation package="server.impl" />
把解析成一个AnnotationConfig 类型的bean对象了。