Spring常用设计模式总结

1.单例模式

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

spring创建的bean默认为单例的
Spring提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。

2.代理模式

定义: 为另一个对象提供一个替身或者占位符,以控制对这个对象的访问。

spring中的具体表现为 AOP 面向切面编程。这一部分用了大量的代理模式实现,实现的形式分为两种:
1.JDK代理 (基于接口)
2.CGLIB代理 (基于子类)

3.工厂模式

定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

// AbstractFactoryBean.java
// 继承了FactoryBean,工厂Bean的主要作用是为了实现getObject()返回Bean实例
  public abstract class AbstractFactoryBean<T> implements FactoryBean<T>, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {

// 定义了获取对象的前置判断工作,创建对象的工作则交给了一个抽象方法
// 这里判断了Bean是不是单例并且是否已经被加载过了(未初始化但加载过了,这个问题涉及到Spring处理循环依赖,以后会讨论到)
  public final T getObject() throws Exception {
        return this.isSingleton()?(this.initialized?this.singletonInstance:this.getEarlySingletonInstance()):this.createInstance();
    }
// 由子类负责具体创建对象
protected abstract T createInstance() throws Exception;
}

之所以这么写是因为这种写法带来了两个好处:

1.保证了创建Bean的方式的多样性
Bean工厂有很多种,它们负责创建各种各样不同的Bean,比如Map类型的Bean,List类型的Bean,Web服务Bean,子类们不需要关心单例或非单例情况下是否需要额外操作,只需要关心如何创建Bean,并且创建出来的Bean是多种多样的。

2. 严格规定了Bean创建前后的其它动作
虽然子类可以自由的去创建Bean,但是创建Bean之前的准备工作以及创建Bean之后对Bean的处理工作是AbstractFactoryBean设定好了的,子类不需要关心,也没权力关心,在这个例子中父类只负责一些前置判断工作。

4.装饰器模式

定义:对象进行多层次的包装,动态地给一个对象添加一些额外的职责,以扩展对象的能力

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

5.观察者模式

定义: 定义了对象之间一对多的依赖,当被依赖对象状态发生改变时,所有的依赖对象都可以收到此消息。

在spring中 ApplicationListener 消息监听模式是观察者模式的代表。
在spring中我们借助ApplicationListener、ApplicationEventPublisher便可以完成事件通知。当调用ApplicationEventPublisher#publishEvent()时,spring会查找实现了ApplicationListener接口、并且使用了指定泛型的bean,然后调用其onApplicationEvent。

6.责任链模式

定义:责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

spring中 springmvc HandlerInterceptor(请求拦截器)完成对Http请求的多重拦截处理。

7.模板方法模式

定义:定义了一个算法的骨架,而将一些实现步骤延迟到子类中。此模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

spring中如 数据库访问 JdbcTemplate ,微服务中RestTemplate都运用了此模式。

8.策略模式

定义:定义了一系列的算法簇,并把它们封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户端。

spring代理对象创建使用了策略模式的实现
Spring 的代理方式有两个 Jdk 动态代理和 CGLIB 代理。这两个代理方式的使用正是使用了策略模式。它的结构图如下所示:
spring代理创建方法

猜你喜欢

转载自blog.csdn.net/qq_15724113/article/details/86495871