Spring框架中的设计模式

设计模式是软件开发中的重要组成部分。它不仅能使我们的代码更加清晰,更富有逻辑性,并且也能使我们更加理解其他框架是如何设计的。在这里,我们将看一下在spring中常见的4种设计模式。

单例模式

单例模式,无需赘言,就是保证某个对象实例在每个应用中只实例化一次。我在之前的文章中也有详细的代码介绍单例模式的7种写法。那么spring中的单例模式又是什么样的呢?

通常,单例对于应用程序来说是全局唯一的,但在 Spring 中,这个约束稍微有一点不一样。Spring 的单例对象是每个 Spring IoC 容器只能有一个对象。 也就是说,Spring 可以为每个应用程序上下文的每个类型创建一个 bean。原因很简单,因为spring一个应用程序可以有多个容器存在,所以如果我们有多个容器,同一个对象就可能有多个。

Spring框架中的设计模式

spring单例模式和严格的单例模式

Spring是通过使用@scope (ConfigurableBeanFactory.SCOPE PROTOTYPE)注解将 bean 范围从单例更改为原型(就是为每个请求创建不同的实例)

工厂方法模式

工厂方法模式包含一个工厂类和一个用于创建所需对象的抽象方法。例如,我们的应用程序需要一个消息对象。 而消息又分为文本消息,语音信息和视频信息,具体如下图所示:

Spring框架中的设计模式

工厂方法模式

Spring的DI(Dependency Injection)依赖注入框架就是使用了该设计模式,Spring将Bean容器作为bean工厂。spring 的BeanFactory类就是工厂类的基类,其中重载了多个getBean方法。

public interface BeanFactory {

Object getBean(String name) throws BeansException;

T getBean(String name, Class requiredType) throws BeansException;

Object getBean(String name, Object... args) throws BeansException;

T getBean(Class requiredType) throws BeansException;

T getBean(Class requiredType, Object... args) throws BeansException;

// ...

}

其中,每个getBean方法都是一个工厂方法,它根据参数返回对应的bean,譬如根据type或者name获取Bean实例。然后spring使用ApplicationContext接口来拓展BeanFactory,实现一些额外的配置,这些额外的配置就是我们的xml文件或者注解。

代理模式

代理模式实际上在我们的网络世界中也是很常见的,对于我们的工作也非常方便。在代码世界中,代理模式就是允许通过一个对象来控制另一个对象的访问的技术。

Spring框架中的设计模式

代理模式

spring对事物的控制就是一种典型的代理模式的应用。我们通过在需要事物的方法上添加@Transactional注解,来让spring代理我们管理事务。

Spring框架中的设计模式

spring管理事务中的代理模式

通常,spring使用两种形式的代理模式:

1. CGlib代理,用于代理类。

2. JDK动态代理,用于代理接口。

模板方法设计模式

在许多框架中,很大一部分代码都是样板代码。例如在执行数据库查询时,必须完成相同的一系列的步骤:

1. 建立连接

2. 执行查询

3. 执行cleanup工作

4. 关闭连接

这些步骤通常适用于模板方法设计模式。

模板方法设计模式,定义了某些操作所需要的一些步骤,并将可定制的步骤抽象为模板方法。然后子类可以实现这个抽象类,然后对缺少步骤提供具体实现。譬如,我们做ES的index,包括全量index,增量index,实时index 3种,他们中的大部分步骤是相同的,因此可以抽象出来作为定制的步骤,然后把它们中间不同的步骤再分别去实现。同样,我们也可以通过提供回调方法来提供不同的步骤。例如spring 的JdbcTemplate就是使用了基于回调机制的模板方法模式。

JdbcTemplate 类提供了查询方法,它包含两个参数:查询字符串 和 ResultSetExtractor 对象。

public class JdbcTemplate {

public T query(final String sql, final ResultSetExtractor rse) throws DataAccessException {

// Execute query...

}

// Other methods...

}

其中ResultSetExtractor将操作的结果转换为 T 类型的对象,其他的查询、建立连接、关闭资源等一系列操作都是可以抽象出来定制的,唯独对结果的处理,我们使用了模板方法设计模式单独进行了处理。

总结

以上就是我们 spring 框架中常用的设计模式,spring正是使用了这些设计模式来简化了开发人员的负担,为我们的开发带来了方便。

#科技青年#


分享到:


相關文章: