吐血整理!最全Spring设计模式总结

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 吐血整理!最全Spring设计模式总结

前言

Spring作为web后端开发者不可绕开的技术框架之一,其优秀的设计模式铸就了其高扩展性和高性能。目前,业内围绕设计模式这一块,共总结了有27种设计模式。就Spring框架而言,依据其功能设计,本文总结了其中所涉及到的设计模型。从Spring的具体功能代码中分析总结出其中所涉及的设计模型,有例子有理论,本文内容较多,干货满满!强烈推荐收藏,以备不时之需

891941f463d132dd098de6631653b049.png


🍕工厂模式

1、应用举例

1、 BeanFactory:Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建

还是传入参数前创建这个要根据具体情况来定。

2、FactoryBean:Spring中的FactoryBean接口的bean是一类叫做factory的bean。其特点是:spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这 个bean.getOjbect()方法的返回值。


2、功能解析

在Spring框架中,对于以上两个类的使用场景可以说是框架的重中之重!以下将依据两者在系统的中的应用,帮助你更深入的理解其中的设计之美:

1、BeanFactory对象的使用,可以说BeanFactory对象的设计,完全覆盖了Spring框架中的每一个对象的生成过程。其作用范围可以从以下两个角度进行分析:一是获取框架中自带的Bean对象,二是往框架中塞入自定义个Bean对象。

(1) 在Spring容器启动阶段:

764ce81f08852f318a3446e602e199a2.png

(2) 容器中bean的实例化阶段:实例化阶段主要是通过反射或者CGLIB对bean进行实例化,在这个阶段Spring又给我们暴露了很多的扩展点,正是通过继承这些扩展点,让我们可以把自己自定义的Bean放入到容器中。

bf3dac1f932eda4a94416cae4fa9dacd.png


3、设计原理

1、松耦合。可以将原来硬编码的依赖,通过Spring这个beanFactory这个

工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入

了第三方——spring这个beanFactory,由它来解决bean之间的依赖

问题,达到了松耦合的效果.

2、bean的额外处理。通过Spring接口的暴露,在实例化bean的阶段我们

可以进行一些额外的处理,这些额外的处理只需要让bean实现对应的

接口即可,那么spring就会在bean的生命周期调用我们实现的接口来

处理该bean。


🍔单例模式

1、应用举例

Spring依赖注入Bean实例默认是单例的。


2、功能解析

我们从底层原理分析可以得出:Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean中的doGetBean方法底层是调用getSingleton进行bean的创建。


所以,我们直接看getSingleton()方法的源码便可以领略到其中的精髓:

 public Object getSingleton(String beanName){
2 //参数true设置标识允许早期依赖
3 return getSingleton(beanName,true);
4 }
5 protected Object getSingleton(String beanName, boolean allowEarl
yReference) {
6 //检查缓存中是否存在实例
7 Object singletonObject = this.singletonObjects.get(beanName);
8 if (singletonObject == null && isSingletonCurrentlyInCreation(be
anName)) {
9 //如果为空,则锁定全局变量并进行处理。
10 synchronized (this.singletonObjects) {
11 //如果此bean正在加载,则不处理
12 singletonObject = this.earlySingletonObjects.get(be
anName);
13 if (singletonObject == null && allowEarlyReference) {
14 //当某些方法需要提前初始化的时候则会调用addSingleFactory 方法将对应
的ObjectFactory初始化策略存储在singletonFactories
15 ObjectFactory singletonFactory = this.singleton
Factories.get(beanName);
16 if (singletonFactory != null) {
17 //调用预先设定的getObject方法
18 singletonObject = singletonFactory.getObjec
t();
19 //记录在缓存中,earlysingletonObjects和singletonFactories互斥
20 this.earlySingletonObjects.put(beanName, singletonObject);
21 this.singletonFactories.remove(beanName);
22 }
23 }
24 }
25 }
26 return (singletonObject != NULL_OBJECT ? singletonObject : null)
27 }

3、设计原理

保证一个类仅有一个实例,并提供一个访问它的全局访问点。


🍟适配器模式

1、应用举例

SpringMVC中的适配器HandlerAdatper


2、功能解析

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

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

HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕

后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。

2cf411ae82567cecbdbe6d796295e910.png


3、设计原理

HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的

Handler和一个对应的HandlerAdapter即可。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的

适配器实现类,让适配器代替controller执行相应的方法。这样在扩展

Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展

了。


🌭装饰器模式

1、应用举例

Spring中用到的装饰器模式在类名上有两种表现:

  • 一种是类名中含有Wrapper
  • 另一种是类名中含有Decorator


2、功能解析

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。


3、设计原理

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

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


🍿代理模式

1、应用举例

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


2、功能解析

  • 动态代理:
    在内存中构建的,不需要手动编写代理类
  • 静态代理:
    需要手工编写代理类,代理类引用被代理对象。


3、设计原理

切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器

会为目标对象创建动态的创建一个代理对象。SpringAOP就是以这种

方式织入切面的。

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

相关文章
|
6月前
|
设计模式 SQL Java
Spring中的设计模式
Spring中的设计模式
|
1月前
|
设计模式 缓存 Java
面试题:谈谈Spring用到了哪些设计模式?
面试题:谈谈Spring用到了哪些设计模式?
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
3月前
|
设计模式 SQL Java
一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个
该文章主要介绍了Spring框架中使用的设计模式,并列举了一些常见的设计模式及其在Spring框架中的应用。
一探到底!Spring团队使用的那些设计模式,快来看看你用过哪几个
|
3月前
|
设计模式 缓存 Java
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍
|
5月前
|
设计模式 Java 程序员
Spring用到了哪些设计模式?
Spring用到了哪些设计模式?
42 1
|
6月前
|
设计模式 安全 Java
【初学者慎入】Spring源码中的16种设计模式实现
以上是威哥给大家整理了16种常见的设计模式在 Spring 源码中的运用,学习 Spring 源码成为了 Java 程序员的标配,你还知道Spring 中哪些源码中运用了设计模式,欢迎留言与威哥交流。
330 3
|
6月前
|
设计模式 Java 数据库连接
Spring Framework 6 中的设计模式
Spring Framework 6 中的设计模式
43 1
|
XML Java 数据格式
Spring_总结_02_依赖注入
一、前言 本文承接上一节:Spring_总结_01_Spring概述 在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。 这一节我们开始了解Spring的第二大原则中的依赖注入,这属于六大模块中的核心容器部分。
1704 0

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78