Skip to content

Spring都使用了哪些设计模式

单例模式

在注册bean的时候,默认都是单例模式,即scope="singleton"。只不过这个单例是在ioc容器中唯一的,是基于名称唯一的。

原型模式

在注册bean的时候,如果设置为多例模式,即scope="prototype"。此时,每次获取bean的时候,都会通过克隆获取bean的实例。

模板模式

模板模式的核心是父类定义号流程,然后将流程中需要子类实现的方法进行抽象化,以便于子类继承实现。例如AbstractApplicationContext中的refresh方法中,实现了启动IOC容器的大部分逻辑。而其中的getBeanFactoryrefreshBeanFactory等方法需要子类实现。在ClassPathXmlApplicationContext以及AnnotationConfigApplicationContext中,都是实现了AbstractApplicationContext中定义的getBeanFactoryrefreshBeanFactory等方法。

观察者模式

观察者模式是对象间的一对多的依赖关系,当一个对象发生改变时,依赖它的所有对象都会得到通知,并自动更新。Spring的事件驱动模型就是一个很好的实现,

  • 定义事件:实现一个继承ApplicationEvent的事件类
  • 定义观察者:实现ApplicationListener接口
  • 发布事件:调用ApplicationContextpublishEvent方法,所有的观察者会收到事件并处理

工厂模式

典型的是BeanFactory,通过getBean方法获取bean实例。

代理模式

代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的访问。Spring AOP中就是非常明确的实现,它是基于动态代理的,如果要代理的对象实现了接口,则aop会使用jdk代理去创建,如果没有接口,则aop会使用cglib代理去创建。