spring NamespaceHandler源码解析

632 阅读1分钟

用途

  • 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());
    ... 省略
}

演示

demo

所用到的类结构