spring框架中用到的设计模式

工厂模式

代码:org.springframework.beans.factory.BeanFactory

BeanFactory是Spring容器的顶级接口,我们平时常用的实现有ClassPathXmlApplicationContext和XmlWebApplicationContext

一般在工厂模式中有四种角色:抽象工厂、具体工厂、抽象产品、具体产品

BeanFactory.getBean方法,就是用于创建产品

优点:通过工厂创建对象实例,和具体的实现类进行了解耦,并且有更好的可扩展性。

代理模式

我们熟悉的AOP就是用动态代理模式实现的,它的实现方式有两种:

  • JDK的JdkDynamicAopProxy
  • CGlib的CglibAopProxy

优点:

一、业务增强:不修改原有代码逻辑,在原有方法前后增加业务功能

二、公共模块:不用在每个类中调用,降低耦合度,提高了系统的可维护性

单例模式

代码:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

 spring中的bean默认使用单例模式

DefaultSingletonBeanRegistry.getSingleton方法中为了延迟加载,用到了双重判断来避免重复创建。

优点:

一、对于重量级对象,省略了重复创建的时间花费,减少了系统开销

二、减少GC线程回收内存的压力

原型模式

spring中的bean还可以使用原型模式,scope="prototype"

原型模式类似深拷贝,避免重新创建对象的高成本,并且新对象和原有对象不相互影响。

适配器模式

SpringMVC中的适配器HandlerAdapter

DispatcherServlet通过HandlerAdapter.handle()方法获取ModelAndView

而实际处理的是不同的Controller,只要每个Controller对应建一个类实现HandlerAdapter,就能进行适配。

SpringAOP中将Advice转为Interceptor,也用到了AdviceAdapter适配器模式。

装饰器模式

在不改变原有对象的基础上,将功能附加到对象上,相比生成子类更灵活。

类名中包含wrapper或Decorator

观察者模式

ApplicationEvent事件实体,ApplicationEventPublisher发布事件,

ApplicationListener事件监听:实现onApplicationEvent方法,监听到事件后的处理

通过AbstractApplicationContext.publishEvent()方法,将事件存到一个set中。

当有新事件时,查询所有ApplicationListener的实现类,并执行onApplicationEvent()方法

策略模式

Resource接口,Spring提供了很多实现类

思想就是通过外部条件使用不同算法解决问题

模板方法模式

Spring几乎所有的外接扩展都采用了这种模式。

如JDBCTemplate,利用回调重写JDBCTemplate的方法

又比如PlatformTransactionManager是spring中的事务管理器,这个接口中定义了提交和回滚方法。

然后用AbstractPlatformTransactionManager抽象方法作为骨架,定义事务的流程和一些钩子,定义了抽象方法doRollback和doCommit

这些抽象方法延迟到子类中实现DataSourceTransactionManager。

 

posted @ 2023-12-22 15:02  极光下的鹅  阅读(15)  评论(0编辑  收藏  举报