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正是使用了這些設計模式來簡化了開發人員的負擔,為我們的開發帶來了方便。

#科技青年#


分享到:


相關文章: