Handler模式

  • 命名空间解析中的NamespaceHandler(静态的Handler处理方式)
    • NamespaceHandlerSupport(Abstract)
      • ContextNamespaceHandler
    • MvcNamespaceHandler
    • 总结
  • SpringMVC中的HttpRequestHandler处理模式(动态的Handler处理式)
    • DefaultServletHttpRequestHandler
    • SockJsHttpRequestHandler
    • WebSocketHttpRequestHandler
    • 总结

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

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

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

NamespaceHandlerSupport(Abstract)

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

ContextNamespaceHandler

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

 @Overridepublic 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

Spring中的设计模式之Handler模式(一)相关推荐

  1. Spring中的设计模式:模板方法模式

    目录 导读 什么是模板模式 优点 缺点 简单演示 Spring中的模板模式 模板抽象类 模板方法 抽象方法 具体子类 总结 导读 文章首发于微信公众号设计模式:模板模式,原创不易,谢谢支持!!! 模板 ...

  2. JDK和Spring中的设计模式

    JDK中的设计模式(17) 创建型 1)工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2)单例模式 Runtime.getRuntime() 3 ...

  3. Spring 中的设计模式

    spring 中的设计模式 单例模式: bean 默认都是单例的 工厂模式: BeanFactory 模板方法: postProcessBeanFactory.onRefresh.initProper ...

  4. [Head First设计模式]山西面馆中的设计模式——装饰者模式

    原文:[Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 在山西面馆吃鸡蛋面的时候突然想起装饰者这个模式,觉得面馆这个场景跟书中的星巴兹咖啡的场景很像,边吃边思考装饰者模式.这里 ...

  5. 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器

    理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...

  6. 浅谈spring中的设计模式(转)

    工厂模式 BeanFactory,从xml或者注解加载BeanDefinition,然后实例化对象,其中AbstractAutowiredCapableBeanFactory实现了主要的逻辑 单例模式 ...

  7. 这些Spring中的设计模式,你都知道吗?

    来自: itxxz.com/a/javashili/tuozhan/2014/0601/7.html 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆 ...

  8. spring中的设计模式_面试官:来给我说一下 Spring 中使用了哪些设计模式?

    文章来源:itxxz.com/a/javashili/tuozhan/2014/0601/7.html 导读:设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直 ...

  9. spring中的设计模式_面试:设计模式在spring中的应用

    设计模式为我们解决一类问题提供了最佳的解决方案,我们在实际工作其实不太常用到,以至于会经常想不到设计模式.究其原因都是我们只是在使用别人框架的缘故,在这些框架的代码中经常能看到设计模式的影子,我们以s ...

最新文章

  1. git 修改全局配置
  2. Deep learning:卷积神经网络之卷积计算、作用与思想
  3. adas--智能驾驶辅助系统
  4. java中的基本数据类型(四类八种)
  5. mybatis的typeAliases别名
  6. 32位mips运算器logisim_大神教你制作一个简单的16位CPU
  7. 鼠标移入视频播放,鼠标移出播放停止,恢复到原来状态
  8. Android 系统(216)---Android坐标分析过程
  9. TIA 和step 7硬件更新网址汇总
  10. macOS 开发 - Command Line Tool 命令行工具
  11. 计算机一级网页制作教程视频教程,网页制作入门教程(一)
  12. lvds接口屏线安装图解_lvds液晶屏幕接口详解
  13. 如何搭建简易的Wiki系统
  14. linux文件分号意思,linux中的分号和,|和||的用法与区别
  15. 除尘器选型需要考虑的因素
  16. Epub文件解析库-- Epublib
  17. 从多臂老虎机开始学习强化学习中的探索与利用
  18. 豆瓣 9.3 的高分,牛逼的 Git!
  19. 打开网上邻居,点击“查看工作组计算机”,出现:“Workgroup无法访问,您...
  20. Abnormal Activity Detection Using Pyroelectric Infrared Sensors

热门文章

  1. 输入阻抗、输出阻抗和阻抗匹配
  2. 关于Tcpdump抓包总结
  3. 苏州线下python培训班
  4. Geomagic Studio 操作记录
  5. 图解SQL的连接:左连接、右连接、全连接、内连接、自然连接
  6. 帝国的黄昏(4):彪悍的人生只需要一篇论文
  7. Ural 1181 Cutting a Painted Polygon
  8. ngix 常用配置之 location 匹配规则
  9. ng-appdata-ng-app
  10. python参数传递,如何让可变参数当作不可变参数传递