Spring设计模式总结

15 篇文章 1 订阅
4 篇文章 0 订阅

目录

1.简单工厂

实现方式:

实质:

实现原理:

bean容器的启动阶段:

容器中bean的实例化阶段:

设计意义:

2.工厂方法

实现方式:

实现原理:

 说明:

3.单例模式

getSingleton()过程图

总结 

4.适配器模式

实现方式:

实现原理:

实现过程:

实现意义:

5.装饰器模式

实现方式:

实质:


1.简单工厂

实现方式:

BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根 据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建 还是传入参数前创建这个要根据具体情况来定。

实质:

由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

实现原理:

bean容器的启动阶段:

       读取bean的配置,将bean元素分别转换成一个 BeanDefinition对象。

       然后通过BeanDefinitionRegistry将这些bean注册到 beanFactory中,保存在它的一个ConcurrentHashMap中。

       将BeanDefinition注册到了beanFactory之后,在这里 Spring为我们提供了一个扩展的切口,允许我们通过实现接口 BeanFactoryPostProcessor 在此处来插入我们定义的代码。

        典型的例子就是:PropertyPlaceholderConfigurer,我们一般在配置 数据库的dataSource时使用到的占位符的值,就是它注入进去的。

容器中bean的实例化阶段:

实例化阶段主要是通过反射或者CGLIB对bean进行实例化,在这个阶 段Spring又给我们暴露了很多的扩展点:

      各种的Aware接口,比如 BeanFactoryAware,对于实现了 这些Aware接口的bean,在实例化bean时Spring会帮我们注入对 应的BeanFactory的实例。

       BeanPostProcessor接口,实现了BeanPostProcessor接口 的bean,在实例化bean时Spring会帮我们调用接口中的方法。

       InitializingBean接口,实现了InitializingBean接口的 bean,在实例化bean时Spring会帮我们调用接口中的方法。

       DisposableBean接口,实现了BeanPostProcessor接口的 bean,在该bean死亡时Spring会帮我们调用接口中的方法。

设计意义:

松耦合。可以将原来硬编码的依赖,通过Spring这个beanFactory这个 工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入 了第三方——spring这个beanFactory,由它来解决bean之间的依赖 问题,达到了松耦合的效果.

bean的额外处理。通过Spring接口的暴露,在实例化bean的阶段我们 可以进行一些额外的处理,这些额外的处理只需要让bean实现对应的 接口即可,那么spring就会在bean的生命周期调用我们实现的接口来 处理该bean。[非常重要]

2.工厂方法

实现方式:

FactoryBean接口。

实现原理:

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

例子:

典型的例子有spring与mybatis的结合。

代码示例:

 说明:

我们看上面该bean,因为实现了FactoryBean接口,所以返回的不是 SqlSessionFactoryBean 的实例,而是它的 SqlSessionFactoryBean.getObject() 的返回值。

扩展:设计模式是什么鬼(工厂方法)

3.单例模式

Spring依赖注入Bean实例默认是单例的。 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 }

getSingleton()过程图

ps:spring依赖注入时,使用了 双重判断加锁 的单例模式

总结 

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

Spring对单例的实现:spring中的单例模式完成了后半句话,即提供 了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是 因为spring管理的是任意的java对象。

扩展:设计模式是什么鬼(单例)

4.适配器模式

实现方式:

SpringMVC中的适配器HandlerAdatper。

实现原理:

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

实现过程:

DispatcherServlet根据HandlerMapping返回的handler,向 HandlerAdatper发起请求,处理Handler。 HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕 后Handler会向HandlerAdapter返回一个ModelAndView,最后由 HandlerAdapter向DispatchServelet返回一个ModelAndView。

实现意义:

HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的 Handler和一个对应的HandlerAdapter即可。 因此Spring定义了一个适配接口,使得每一种Controller有一种对应的 适配器实现类,让适配器代替controller执行相应的方法。这样在扩展 Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展 了。

扩展:设计模式是什么鬼(适配器)

5.装饰器模式

实现方式:

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

实质:

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

扩展:设计模式是什么鬼(装饰)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值