Spring在通过xml容器加载BeanDefinition信息的时候,用到了NamespaceHandler,这样可方便我们开发出自定义的标签。比如,Druid标签

命名空间解析中的NamespaceHandler(静态的Handler处理方式)

NamespaceHandler是一个处理器,该处理器负责,将该命名空间下的所有解析器进行都注册。以解析该命名空间下的Spring标签或者自定义标签。

NamespaceHandlerSupport(Abstract)

是NamespaceHandler的骨架实现,在这里实现了根据ELement找到合适的解析器进行解析元素。具体解析交由对应的解析器来处理。
总结
这个抽象类做了两件事,注册命名空间下的解析器。根据元素找对应的解析器解析元素。
注意registerBeanDefinitionParser的final修饰。

ContextNamespaceHandler

在对象创建后,完成该命名空间下的解析器对象的创建和注册。

	@Override
	public void init() {
		registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
		registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
		registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
		registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
		registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
		registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
		registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
		registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
	}

MvcNamespaceHandler

@Override
public void init() {
   registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
   registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
   registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
   registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
   registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
   registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser());
   registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser());
   registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser());
   registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser());
   registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser());
   registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser());
   registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser());
   registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser());
}

总结

从NamespaceHandler,可以看出,这种处理code方式,简洁优雅。
掌握这种代码处理方式,有两点:

  1. 这是一种静态的handler。namespace在xml中事先声明好的。
  2. 存在namespace跟namespaceHandler的映射。
  3. 直接读取XML中的namespace获取对应的NamespaceHandler。
  4. 结合其父类来看,这还是一个基于表驱动的编程方式来优化if-else条件逻辑。

SpringMVC中的HttpRequestHandler处理模式(动态的Handler处理式)

HttpRequestHandler,对处理HTTP requests组件作处理的一个Handler接口,类似于Servlet。在HttpRequestHandlerAdapter中被使用。例如WebSocket请求,该请求是一个upgrade版的HTTP request请求等。

@FunctionalInterface
public interface HttpRequestHandler {

   /**
    * Process the given request, generating a response.
    * @param request current HTTP request
    * @param response current HTTP response
    * @throws ServletException in case of general errors
    * @throws IOException in case of I/O errors
    */
   void handleRequest(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException;

}

DefaultServletHttpRequestHandler

SockJsHttpRequestHandler

WebSocketHttpRequestHandler

总结

  1. Handler interface的handle方法
  2. Handler interface 的实现类
  3. 通常与适配器配合使用,比如Spring中的三种HandlerAdapter
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐