实现原理:

HandlerAdatper根据Handler规则执行不同的Handler。

实现过程:

DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。

HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。

实现意义:

HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。

5.装饰器模式

实现方式:

Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。

实质:

动态地给一个对象添加一些额外的职责。

就增加功能来说,Decorator模式相比生成子类更为灵活。

6.代理模式

实现方式:

AOP底层,就是动态代理模式的实现。

动态代理:

在内存中构建的,不需要手动编写代理类

静态代理:

需要手工编写代理类,代理类引用被代理对象。

实现原理:

切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象创建动态的创建一个代理对象。SpringAOP就是以这种方式织入切面的。

织入:把切面应用到目标对象并创建新的代理对象的过程。

7.观察者模式

实现方式:

spring的事件驱动模型使用的是 观察者模式 ,Spring中Observer模式常用的地方是listener的实现。

具体实现:

事件机制的实现需要三个部分,事件源,事件,事件监听器

ApplicationEvent抽象类[事件]

继承自jdk的EventObject,所有的事件都需要继承ApplicationEvent,并且通过构造器参数source得到事件源.

该类的实现类ApplicationContextEvent表示ApplicaitonContext的容器事件.

代码:

public abstract class ApplicationEvent extends EventObject {private static final long serialVersionUID = 7099057708183571937L;private final long timestamp;public ApplicationEvent(Object source) {super(source);this.timestamp = System.currentTimeMillis();}public final long getTimestamp() {return this.timestamp;}
}

ApplicationListener接口[事件监听器]

继承自jdk的EventListener,所有的监听器都要实现这个接口。

这个接口只有一个onApplicationEvent()方法,该方法接受一个ApplicationEvent或其子类对象作为参数,在方法体中,可以通过不同对Event类的判断来进行相应的处理。

当事件触发时所有的监听器都会收到消息。

代码:

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {void onApplicationEvent(E event);
}

ApplicationContext接口[事件源]

ApplicationContext是spring中的全局容器,翻译过来是”应用上下文”。

实现了ApplicationEventPublisher接口。

职责:

负责读取bean的配置文档,管理bean的加载,维护bean之间的依赖关系,可以说是负责bean的整个生命周期,再通俗一点就是我们平时所说的IOC容器。

代码:

public interface ApplicationEventPublisher {void publishEvent(ApplicationEvent event);
}   public void publishEvent(ApplicationEvent event) {Assert.notNull(event, "Event must not be null");if (logger.isTraceEnabled()) {logger.trace("Publishing event in " + getDisplayName() + ": " + event);}getApplicationEventMulticaster().multicastEvent(event);if (this.parent != null) {this.parent.publishEvent(event);}
}

ApplicationEventMulticaster抽象类[事件源中publishEvent方法需要调用其方法getApplicationEventMulticaster]

属于事件广播器,它的作用是把Applicationcontext发布的Event广播给所有的监听器.

代码:

public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext, DisposableBean {  private ApplicationEventMulticaster applicationEventMulticaster;  protected void registerListeners() {  // Register statically specified listeners first.  for (ApplicationListener<?> listener : getApplicationListeners()) {  getApplicationEventMulticaster().addApplicationListener(listener);  }  // Do not initialize FactoryBeans here: We need to leave all regular beans  // uninitialized to let post-processors apply to them!  String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);  for (String lisName : listenerBeanNames) {  getApplicationEventMulticaster().addApplicationListenerBean(lisName);  }  }
}

8.策略模式

实现方式:

Spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。

Resource 接口介绍

source 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口。

Resource 接口主要提供了如下几个方法:

  • **getInputStream():**定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流。调用者必须负责关闭输入流。
  • **exists():**返回 Resource 所指向的资源是否存在。
  • **isOpen():**返回资源文件是否打开,如果资源文件不能多次读取,每次读取结束应该显式关闭,以防止资源泄漏。
  • **getDescription():**返回资源的描述信息,通常用于资源处理出错时输出该信息,通常是全限定文件名或实际 URL。
  • **getFile:**返回资源对应的 File 对象。
  • **getURL:**返回资源对应的 URL 对象。

最后两个方法通常无须使用,仅在通过简单方式访问无法实现时,Resource 提供传统的资源访问的功能。

Resource 接口本身没有提供访问任何底层资源的实现逻辑,针对不同的底层资源,Spring 将会提供不同的 Resource 实现类,不同的实现类负责不同的资源访问逻辑。

Spring 为 Resource 接口提供了如下实现类:

  • **UrlResource:**访问网络资源的实现类。
  • **ClassPathResource:**访问类加载路径里资源的实现类。
  • **FileSystemResource:**访问文件系统里资源的实现类。
  • **ServletContextResource:**访问相对于 ServletContext 路径里的资源的实现类.
  • **InputStreamResource:**访问输入流资源的实现类。
  • **ByteArrayResource:**访问字节数组资源的实现类。

这些 Resource 实现类,针对不同的的底层资源,提供了相应的资源访问逻辑,并提供便捷的包装,以利于客户端程序的资源访问。

9.模版方法模式

经典模板方法定义:

父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现。

最大的好处:代码复用,减少重复代码。除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好了。

所以父类模板方法中有两类方法:

**共同的方法:**所有子类都会用到的代码

**不同的方法:**子类要覆盖的方法,分为两种:

  • 抽象方法:父类中的是抽象方法,子类必须覆盖
  • 钩子方法:父类中是一个空方法,子类继承了默认也是空的

注:为什么叫钩子,子类可以通过这个钩子(方法),控制父类,因为这个钩子实际是父类的方法(空方法)!

Spring模板方法模式实质:

是模板方法模式和回调模式的结合,是Template Method不需要继承的另一种实现方式。Spring几乎所有的外接扩展都采用这种模式。

具体实现:

JDBC的抽象和对Hibernate的集成,都采用了一种理念或者处理方式,那就是模板方法模式与相应的Callback接口相结合。

采用模板方法模式是为了以一种统一而集中的方式来处理资源的获取和释放,以JdbcTempalte为例:

public abstract class JdbcTemplate {  public final Object execute(String sql){  Connection con=null;  Statement stmt=null;  try{  con=getConnection();  stmt=con.createStatement();  Object retValue=executeWithStatement(stmt,sql);  return retValue;  }catch(SQLException e){  ...  }finally{  closeStatement(stmt);  releaseConnection(con);  }  }   protected abstract Object executeWithStatement(Statement   stmt, String sql);
}

引入回调原因:

JdbcTemplate是抽象类,不能够独立使用,我们每次进行数据访问的时候都要给出一个相应的子类实现,这样肯定不方便,所以就引入了回调。

回调代码

## 总结> 这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人![**资料免费领取方式:戳这里**](https://gitee.com/vip204888/java-p7)有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人![**资料免费领取方式:戳这里**](https://gitee.com/vip204888/java-p7)![](https://img-blog.csdnimg.cn/img_convert/b09fc118e9472934d3bc21c0200d0e5d.png)

Spring中经典的9种设计模式,一定要记牢,Java基础教程pdf百度云相关推荐

  1. Spring 中经典的 9 种设计模式,打死也要记住啊!

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客:点 ...

  2. 【设计模式】Spring 中经典的 9 种设计模式

    前言 控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制翻转) 是Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想.它的主要目的 ...

  3. springboot单例模式注入对象_Spring 中经典的 9 种设计模式,打死也要记住啊!

    本文转载自公众号"Java专栏 1.简单工厂(非23种设计模式中的一种) 2.工厂方法 3.单例模式 4.适配器模式 5.装饰器模式 6.代理模式 7.观察者模式 8.策略模式 9.模版方法 ...

  4. controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

    Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...

  5. Spring/SpringBoot系列之Spring中涉及的9种设计模式【七】

    1. 总览 Spring中涉及的设计模式: 简单工厂(非23种设计模式中的一种) 工厂方法 单例模式 适配器模式 装饰器模式 代理模式 观察者模式 策略模式 模版方法模式 2. 详细介绍 2.1 简单 ...

  6. 必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Although yo ...

  7. mybatis中经典的9种设计模式

    mybatis中用到了9种设计模式,学习mybatis的源码以及设计模式,可以提高开发人员软件设计以及开发的水平,写出更加优雅的代码. 文章目录 建造者模式 工厂模式 单例模式 代理模式 组合模式 模 ...

  8. spring中用到的9种设计模式

    spring中用到了9种设计模式,学习spring的源码以及设计模式,可以提高开发人员软件设计以及开发的水平,写出更加优雅的代码. 文章目录 简单工厂(非23种设计模式中的一种) 工厂方法 单例模式 ...

  9. Spring主要用到两种设计模式

    Spring主要用到两种设计模式 1.工厂模式 Spring容器就是实例化和管理全部Bean的工厂. 工厂模式可以将Java对象的调用者从被调用者的实现逻辑中分离出来. 调用者只关心被调用者必须满足的 ...

最新文章

  1. python3语法-python3 标签语法有什么用?
  2. 删除所有的视图,存储过程
  3. Detection and Classification of Acoustic Scenes and Events(DCASE2013详细介绍)
  4. unbutu安装搜狗输入法【转载】
  5. springboot 配置webservice接口
  6. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法
  7. java避免空指针异常
  8. python 如何安装软件包故障_Python安装软件包出错
  9. Day2 python基础
  10. 115怎么利用sha1下载东西_如何不登陆115网盘也能使用迅雷下载其文件?教你手动解析115网盘文件真实的直接下载地址【转】...
  11. SPA的原理及其实现
  12. 中国大学慕课——程序设计与算法(一)第二周测验
  13. 为知笔记如何一键收藏微信文章?
  14. Caused by: org.apache.thrift.TApplicationException: Required field ‘filesAdded‘ is unset
  15. shell脚本中的空格
  16. CSS入门教程——HTML选择器
  17. java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串
  18. 全球及中国LCP行业发展动态与投资趋势分析报告2022~2028年
  19. 3.27下午 口语练习P41
  20. 很不错的html学习资料

热门文章

  1. VS 动态库 导出C++类
  2. micronet 测试2
  3. cmake error C2220: 以下警告被视为错误
  4. python字典随机取数
  5. ubuntu子系统重置
  6. ping 一会通一会不通
  7. 双边滤波JAVA代码实现
  8. mySql中Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题
  9. 怎么查看自己电脑的配置_怎么查看自己网卡是千兆网卡还是百兆网卡
  10. epoll示例(水平触发)