Spring中的设计模式之Handler模式(一)
Handler模式NamespaceHandlerNamespaceHandlerSupport(Abstract)ContextNamespaceHandler总结Spring在通过xml容器加载BeanDefinition信息的时候,用到了NamespaceHandler,这样可方便我们开发出自定义的标签。比如,Druid标签NamespaceHandlerNamespaceHandle...
·
Handler模式
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方式,简洁优雅。
掌握这种代码处理方式,有两点:
- 这是一种静态的handler。namespace在xml中事先声明好的。
- 存在namespace跟namespaceHandler的映射。
- 直接读取XML中的namespace获取对应的NamespaceHandler。
- 结合其父类来看,这还是一个基于表驱动的编程方式来优化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
总结
- Handler interface的handle方法
- Handler interface 的实现类
- 通常与适配器配合使用,比如Spring中的三种HandlerAdapter
更多推荐
已为社区贡献1条内容
所有评论(0)