Spring设计模式
Spring设计模式
简单工厂模式
BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
实现原理:
bean容器的启动阶段:
读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。
然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中,保存在它的一个ConcurrentHashMap中。
将BeanDefinition注册到了beanFactory之后,在这里Spring为我们提供了一个扩展的切口,允许我们通过实现接口BeanFactoryPostProcessor 在此处来插入我们定义的代码。
简单工厂模式:
- 创建抽象父类
- 子类继承父类实现抽象方法
- 工厂类根据条件产生不同的子类
缺点:
违背了开闭原则,工厂类可能容易成为上帝类。
代码:
1 | public abstract class DaBen{ } |
工厂方法模式
FactoryBean接口。
实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。
工厂方法模式 代码示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32public class DaBen{ }
public class DaBenC extends DaBen{
public DaBenC() {
System.out.println("DaBenC created....");
}
}
public class DaBenE extends DaBen{
public DaBenE() {
System.out.println("DaBenE created....");
}
}
public interface MainFactory{
DaBen createDaBen();
}
public class DaBenCCreate implements MainFactory{
public DaBen createDaBen() {
return new DaBenC();
}
}
public class DaBenECreate implements MainFactory{
public DaBen createDaBen() {
return new DaBenE();
}
}
public static void main(String[] args) {
MainFactory factoryC = new DaBenCCreate();
factoryC.createDaBen();
MainFactory factoryE = new DaBenECreate();
factoryE.createDaBen();
}
扩展 抽象工厂模式:
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。
单例模式
Spring依赖注入Bean实例默认是单例的。Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。使用了 双重判断加锁 的单例模式。
1 | public Object getSingleton(String beanName){ |
适配器模式
AOP中的AdvisorAdapter是一个适配器接口,它定义了自己支持的Advice类型,并且能把一个Advisor适配成MethodInterceptor(这也是AOP联盟定义的借口)
1 | public interface AdvisorAdapter { |
代理模式
bean初始化的时候的init方法
aopBean初始化的时候直接创建代理类返回
代码示例:
1 | // 接口 |
模板方法模式
spring jdbcTemplate使用了模板方法模式
模板方法模式
优点
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
代码:
1 | public abstract class OneDay { |
观察者模式
Spring 事件驱动模型就是观察者模式很经典的一个应用。
1 |
|
策略模式
代码例子:
1 | //父类 |