一、spring体系
1. spring是什么?
轻量级的开源的J2EE框架。它是一个容器框架,主要实现了ioc,同时又通过aop实现了面向切面编程,它又是一个中间层框架(万能胶)可以起一个连接作用,比如说把mybatis和spring mvc粘合在一起运用,可以让我们的企业开发更快、更简洁
二. 设计模式
1.简单工厂模式
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定,即是否是使用懒加载。
如:BeanFactory接口获取bean和Spring在jvm启动时创建bean实列及对应映射关系工厂。
2.抽象工厂模式
抽象工厂方法模式说白了其实就是简单工厂模式的一种升级或者说是进一步抽象,它可以应用于更加复杂的场景,灵活性也更高。在简单工厂中,由工厂类进行所有的逻辑判断、实例创建;如果不想在工厂类中进行判 断,可以为不同的产品提供不同的工厂,不同的工厂生产不同的产品,每一个工厂都只对应一个相应的对 象,这就是抽象工厂方法模式。
Spring中的FactoryBean就是这种思想的体现,FactoryBean可以理解为工厂Bean,先来看看它的定义:
我们定义一个类UserFactoryBean来实现FactoryBean接口,主要是在getObject方法里new一个User对象。
这样我们通过getBean(id) 获得的是该工厂所产生的User的实例,而不是UserFactoryBean本身的实例,像 下面这样:
3.单例模式
单例模式是指一个类在整个系统运行过程中,只允许产生一个实例。
在Spring中,Bean可以被定义为两种 模式:prototype(多例)和singleton(单例),Spring Bean默认是单例模式。
那Spring是如何实现单例模 式的呢?
答案是通过单例注册表的方式,保证一个类仅会创建一个实例,并提供一个访问它的全局访问点。具体来说就是使用了HashMap。
请注意为了方便你阅读,我对代 码进行了简化:
上面的代码逻辑比较清晰,先到HashMap去拿单实例对象,没拿到就创建一个添加到HashMap。
提供了全局的访问点BeanFactory。同时在创建时也保证只会创建一个对象。
那如何保证的?
spring会判断bean的作用域是否为单例,如果是,则会从单列池缓存中(一般为hashmap的数据结构)直接取,如果为空,则创建对于的对象。
4.代理模式
主要是在aop中体现。
Spring的AOP采用的是动态代理的方式,而动态代理就是指代理类在程序运行时由JVM动态创建。
Spring实现了通过动态代理对类进行方法级别的切面增强,切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态的创建一个代理 对象。并在代理类的方法中设置拦截器,通过执行拦截器中的逻辑增强了代理方法的功能,从而实现 AOP
判断是否创建代理对象会根据配置的切点进行过滤。
代理模式的好处是,可以在目标对象业务功能的基础上添加一些公共的逻辑,比如我们想给目标对象加入日 志、权限管理和事务控制等功能,我们就可以使用代理类来完成,而没必要修改目标类,从而使得目标类保 持稳定。这其实是开闭原则的体现,不要随意去修改别人已经写好的代码或者方法。
5.观察者模式
spring的事件驱动模型使用的是观察者模式,即spring使用到的事件机制。
Spring中Observer模式常用的地方是listener的实现。
详情可参考我的博客:
6.模板模式
父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现。
最大的好处:代码复用,减少重复代码。除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好了。
比如:refresh方法
3.适配器模式,待续
Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替 controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC 的扩展了。
策略模式????
Spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。
装饰器模式
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。