用途
- spring标签解析
- spring自定义标签
继承结构
源码解析
@Test
public void testResolvedMappedHandler() {
DefaultNamespaceHandlerResolver resolver = new DefaultNamespaceHandlerResolver();
NamespaceHandler handler = resolver.resolve("http://www.springframework.org/schema/util");
}
- 构造方法解析
public DefaultNamespaceHandlerResolver() {
this(null, DEFAULT_HANDLER_MAPPINGS_LOCATION);
//DEFAULT_HANDLER_MAPPINGS_LOCATION="META-INF/spring.handlers" ,
//在classpash中寻找spring.handlers,这是k,v结构,具体解析k,v是通过
//org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver
//#getHandlerMappings方法
//存储在Map中
}
- resolve()解析
public NamespaceHandler resolve(String namespaceUri) {
//解析spring.handler,类似于properties的k,v解析
Map<String, Object> handlerMappings = getHandlerMappings();
//获取对应的Handler
Object handlerOrClassName = handlerMappings.get(namespaceUri);
... 省略
String className = (String) handlerOrClassName;
Class<?> handlerClass = ClassUtils.forName(className, this.classLoader);
NamespaceHandler namespaceHandler = (NamespaceHandler);
//实例化Handler
BeanUtils.instantiateClass(handlerClass);
//调用Handler的init()方法,稍后解析
namespaceHandler.init();
handlerMappings.put(namespaceUri, namespaceHandler);
return namespaceHandler;
}
- init()解析
@Override
public void init() {
// 通过自定义的Passer解析bean标签
registerBeanDefinitionParser("constant", new ConstantBeanDefinitionParser());
... 省略
}
演示
所用到的类结构