设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

86 | 开源实战四(下):总结Spring框架用到的11种设计模式

课堂讨论
重点回顾
其他模式
工厂模式
装饰器模式
组合模式
策略模式
适配器模式
Spring框架设计模式总结

该思维导图由 AI 生成,仅供参考

上一节课,我们讲解了 Spring 中支持扩展功能的两种设计模式:观察者模式和模板模式。这两种模式能够帮助我们创建扩展点,让框架的使用者在不修改源码的情况下,基于扩展点定制化框架功能。
实际上,Spring 框架中用到的设计模式非常多,不下十几种。我们今天就总结罗列一下它们。限于篇幅,我不可能对每种设计模式都进行非常详细的讲解。有些前面已经讲过的或者比较简单的,我就点到为止。如果有什么不是很懂的地方,你可以通过阅读源码,查阅之前的理论讲解,自己去搞定它。如果一直跟着我的课程学习,相信你现在已经具备这样的学习能力。
话不多说,让我们正式开始今天的学习吧!

适配器模式在 Spring 中的应用

在 Spring MVC 中,定义一个 Controller 最常用的方式是,通过 @Controller 注解来标记某个类是 Controller 类,通过 @RequesMapping 注解来标记函数对应的 URL。不过,定义一个 Controller 远不止这一种方法。我们还可以通过让类实现 Controller 接口或者 Servlet 接口,来定义一个 Controller。针对这三种定义方式,我写了三段示例代码,如下所示:
// 方法一:通过@Controller、@RequestMapping来定义
@Controller
public class DemoController {
@RequestMapping("/employname")
public ModelAndView getEmployeeName() {
ModelAndView model = new ModelAndView("Greeting");
model.addObject("message", "Dinesh");
return model;
}
}
// 方法二:实现Controller接口 + xml配置文件:配置DemoController与URL的对应关系
public class DemoController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
ModelAndView model = new ModelAndView("Greeting");
model.addObject("message", "Dinesh Madhwal");
return model;
}
}
// 方法三:实现Servlet接口 + xml配置文件:配置DemoController类与URL的对应关系
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello World.");
}
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring框架广泛应用多种设计模式,包括适配器、策略、装饰器和工厂模式。适配器模式统一不同方式定义的Controller类中的函数,避免繁琐的逻辑,实现了开闭原则。策略模式体现在Spring AOP中,通过动态代理实现的选择,使得Spring在运行时动态地选择不同的动态代理实现方式。装饰器模式用于增加对事务的支持和对Cache的数据处理。工厂模式经典应用是实现IOC容器,通过工厂方法创建Bean。此外,Spring还用到了观察者、模板、职责链和代理模式。这些设计模式的应用使得Spring框架更加灵活、可扩展,为开发者提供更好的使用体验。文章还提到了Builder模式在Spring中创建Bean的应用,展示了设计模式在实际项目开发中的重要性和应用价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 黄平
    TransactionAwareCacheDecorator怎么用呢?

    作者回复: 😂 自己查查吧

    2020-06-11
  • 小晏子
    可以使用FactoryBean接口来实现,如下: //StdHttpClient可以理解为已经定义好的一个类,使用builder模式实现。 public class HttpFactoryBean implements FactoryBean<HttpClient>{ private String host; private int port; public HttpClient getObject() throws Exception { return new StdHttpClient.Builder() .host(host) .port(port) .build(); } public Class<? extends HttpClient> getObjectType() { return StdHttpClient.class; } public boolean isSingleton() { return true; } public void setHost(String host) { this.host = host; } public void setPort(int port) { this.port = port; }} 添加配置到bean定义: <beans ...> <bean name="myHttpClient" class="HttpFactoryBean"> <property name="port" value="8080"/> <property name="host" value="localhost"/> </bean> </beans> 之后你就可以使用StdHttpClient实例了。
    2020-05-20
    1
    22
  • 岁月
    不是做java的看的好累....看源码必须是先知道怎么使用, 然后才看源码, 这样才比较好看懂源码.
    2020-05-20
    1
    18
  • 越看到后面,越觉得最好的模式就是没有模式,用好并理解基本的面向对象设计就成功一半了。
    2020-05-20
    2
    15
  • Jie
    这篇内容密度很大,可以看上两天。 另外策略模式那块提到“这两种动态代理实现方式的更多区别请自行百度研究吧”,不是应该用Google搜索么=w=?
    2020-05-20
    3
    5
  • 悟光
    尝试了一下,xml配置未找到直接调用build方法的配置,用构造器注入 类: public class Student { private long id; private String name; private Student(Builder builder) { this.id =builder.id; this.name = builder.name; } public String getName() { return name; } public static class Builder { private long id; private String name; public Student build() { if (StringUtils.isEmpty(name)){ throw new IllegalArgumentException("name is empty"); } return new Student(this); } public void setId(long id) { this.id = id; } public void setName(String name) { this.name = name; } } } 配置: <bean id="build" class="cn.gitv.rt.advertisv5.utils.Student.Builder" > <property name="name" value="aa"/> <property name="id" value="2"/> </bean> <bean id="student" class="cn.gitv.rt.advertisv5.utils.Student"> <constructor-arg ref="build"/> </bean> 2、“实际上,我们可以利用是适配器模式对代码进行改造,让其满足开闭原则,能更好地支持扩赞”。 这一句应该 “赞” 敲串行了。
    2020-05-20
    1
    4
  • 第一装甲集群司令克莱斯特
    一看就会,一写就废!
    2022-11-11归属地:北京
    2
  • 电光火石
    // 通过参考工厂方法来创建BeanId="zheng""的Bean <bean id="zheng" class="com.xzg.cd.StudentBuilder" build-method="build"> <property name="id" value="1"></property> <property name="name" value="wangzheng"></property> </bean> 把factory-method改成build-method
    2020-05-20
    1
    2
  • Heaven
    对象的初始化有两种实现方式。一种是在类中自定义一个初始化函数,并且通过配置文件,显式地告知 Spring,哪个函数是初始化函数
    2020-05-20
    2
  • 牛凡
    在Spring中没有找到AnnotationMethodHandlerAdapter,应该是RequestMappingHandlerAdapter吧
    2021-12-14
    1
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部