首页 > Spring 中用到了那些设计模式?
头像
牛客462784608号
编辑于 2020-09-11 16:36
+ 关注

Spring 中用到了那些设计模式?

Spring IOC控制反转

一种解耦的设计思想,它的主要目的是借助于(Spring 中的 IOC 容器) 实现具有依赖关系的对象之间的解耦

a对象依赖b对象,主动创建b对象,将a对象的创建通过配置文件/注解交给IOC容器管理对象,将控制权反转。

DI(Dependecy Inject,依赖注入)

是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去。

工厂设计模式

通过 BeanFactoryApplicationContext 创建 bean 对象。
ApplicationContext:容器启动的时候,不管你用没用到,一次性创建所有 bean 。
简单工厂模式
对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象
工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂
抽象工厂模式
AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。

单例设计模式

Spring 中 bean 的默认作用域就是 singleton(单例)的。 除了 singleton 作用域,Spring 中 bean 还有下面几种作用域prototype : 每次请求都会创建一个新的 bean 实例。

Spring 实现单例的方式:

  • xml : <bean id="userService" class="top.snailclimb.UserService" scope="singleton"/>
  • 注解:@Scope(value = "singleton")
Spring通过currentHashmap实现实现单例注册表的特殊方式实现单例模式。

饿汉式----构造器私有,一开始new出静态不可变对象,可能造成空间浪费
懒汉式----在方法里调用时new出静态对象,多线程问题,需要sych加锁
DCL懒汉式--双重判断,指令重排问题,需要用voliate关键字修饰
反射-无视私有构造器,不安全问题,假设一对象调用方法创建,一对象反射构造方法创建,(在私有构造器内加锁)假设两对象都是用构造方法创建(加关键字的方法控制)
枚举类---默认单例

代理设计模式

AOP(面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码有利于未来的可拓展性和可维护性

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理

观察者模式

改变监听者的循环判断,程序空转浪费资源,事件主动推送

被观察者(拥有观察者列表,通知所有观察者,具体 被观察者 继承被观察者抽象类)

观察者(实现同一个观察者接口,更新状态)


  1. 定义一个事件(被观察者): 实现一个继承自 ApplicationEvent,并且写相应的构造函数;(事件监听者的列表)
  2. 定义一个事件监听者(观察者),实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
  3. 使用事件发布者 发布消息: 可以通过 ApplicationEventPublisher  的 publishEvent() 方法发布消息。(ApplicationContext


全部评论

(0) 回帖
加载中...
话题 回帖

近期热帖

热门推荐