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。