Spring中的设计模式(工厂单例代理模板适配器)

1、Spring涵盖的内容很广,而且受我现在的知识面的限制,很多知识其实看着很是模糊,并不能全面的了解它。而且我觉得很多理论的知识最终也是以代码的形式体现。而看源码我觉得了解设计模式是必不可少的,所以今天就讲一下Spring中的设计模式。

Java设计模式应该有23种,有人总结spring中运用的设计模式有8种:工厂模式、单例模式、代理模式、模板模式、适配器模式、包装器模式、观察者模式、策略模式。今天我讲前面五种。

2、首先是工厂模式和单例模式,都是创建型模式。工厂模式有一个定义:Define an interface for creating an Object, but let subclass to decide which class to instantiate. Spring中的ApplicationContext应用上下装载bean的定义和组装,Spring自带了多种类型的应用上下文,而创建应用上下文的时候就用到了工厂模式:






上面三种模式都创建了应用上下文,接下来通过看ClassPathXmlApplication的源码,具体看一下工厂模式:









通过以上重重查找最终查到了ApplicationContext这个接口上,通过这个接口继承的类也发现其实应用上下文也是完成BeanFactory的功能。其他类型的应用上下文的源码也大抵是这个样子,大家可以自己去查看。其实我们自己自学的工厂模式都是简单的,而实际运用都是很复杂的,没继承一个类或实现一个接口都是有一定的用意。

3、 接下来看一下单例模式。直接看源码:
首先看一下AbstracBeanFactory源码中getBean的doGetBean方法:




getBean的doGetBean方法调用的getSingleton进行bean的创建:



Bean的创建默认是单例的,当然也是可以设置为非单例。可以看出使用双重判断加锁的单例模式。首先从缓存中获取bean实例,如果为null就对缓存map加锁,然后再取一次,如果继续为null,就创建一个bean。这样双重判断能避免在加锁瞬间,有其他依赖注入引发bean实例创建,从而重复创建的结果。

在这里spring并没有使用私有构造器方法来创建bean,而是通过getObject来创建bean。感兴趣的话可以继续跟踪下去,这也更证明了理论知识是死的,应用的人是活的。

4、代理模式:Spring中使用两种代理模式方式:一种是jdk的java.lang.reflect.Proxy类代理,另外一种是CGLIB库生成目标对象的子类。

Spring AOP是经典代理的表示,而在看书中关于的AOP都是基于注解的,实际应用这个切面也是通过@Aspect,以及通知的几种注解。

5、适配器模式:刚才有提到通知,spring的通知类型有:BeforeAdvice、AfterReturningAdvice和ThrowsAdvice。这三种通知类型实际上是借助适配器模式来实现的。现在来看一下BeforeAdvice适配器:

适配器的作用是扩展

这个相当于目标(Target),是适配器的接口


相当于Adapter


这个就是客户端


6、模板模式: Spring将数据访问过程中固定的和可变的部分划分为两个不同的类:模板(template)和回调(callback)。模板管理过程中固定的部分,而回调处理自定义的数据访问代码。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值