Spring 框架深度集成了多種經典設計模式,這些模式支撐了其核心功能(如IoC、AOP)的實現,以下是關鍵模式及其應用場景的梳理:
1、工廠模式
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯。并且是通過使用一個共同的接口來指向新創建的對象。Spring 中可以使用工廠模式通過 BeanFactory 或者 ApplicationContext 創建 Bean 對象。BeanFactory 和 ApplicationContext 是核心工廠接口,封裝 Bean 的創建邏輯;FactoryBean 擴展工廠能力,支持復雜對象(如 SqlSessionFactoryBean)的定制化構建。
2、單例模式
單例模式是指一個類全局只有一個實例,Spring 框架中默認的 Bean 是單例的。Spring 容器默認以單例作用域管理 Bean(@Scope("singleton")),避免重復創建無狀態對象(如 Service、DAO 層組件),減少資源消耗。底層是通過 ConcurrentHashMap 注冊表管理單例實例。
面試題:Spring 框架管理的 Bean 使用單例模式,是如何解決線程安全問題?
答:(1)通過使用 ThreadLocal 實現線程隔離,ThreadLocal 會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。
(2)若需共享可變狀態,則顯式使用 ConcurrentHashMap、AtomicInteger 等線程安全容器,或通過 synchronized/ReentrantLock 同步關鍵代碼塊。
3、適配器模式
適配器模式(Adapter Pattern)是作為兩個不兼容的接口之間的橋梁。例如,舊的接口規范和新的接口調用方式不兼容,在這種情況下,可以在中間添加一個適配器,適配器提供新的接口調用方式,但是在內部使用的是舊的接口。Spring AOP 模塊對 BeforeAdvice、AfterAdvice 和 ThrowsAdvice 三種通知類型的支持實際上是借助適配器模式來實現的。
4、裝飾器模式
裝飾器模式是指動態給一個對象添加一些額外的職責,就增加功能來說,裝飾者比繼承更加靈活。例如,已經有個登錄功能,需要添加一個新功能,登錄的時候發送短信通知。Spring 中用到的裝飾器模式在類名上有兩種表現:一種是類名中含有 Wrapper,另一種是類名中含有 Decorator。基本上都是動態地給一個對象添加一些額外的職責。
5、代理模式
代理模式是指一個類代表另一個類的功能,Spring 的 AOP 實現基本上都是通過代理模式,代理模式和裝飾器模式實現方法很類似,它們的區別是裝飾器模式是對現有功能的擴展,代理模式是完成其他的功能。例如登錄的時候發送短信是對登錄功能的擴展,是裝飾器模式,如果登錄之前需要網絡檢查,請求簽名是通過代理實現。
6、觀察者模式
觀察者模式又被稱為發布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自行更新。Spring 中的 ApplicationListener 就是使用的觀察者模式。
7、模板方法模式
模板方法模式是類的行為模式。先準備一個抽象類,將部分邏輯以具體方法以及具體構造方法的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模板方法模式的用意。Spring 以 Template 結尾都是模板方法,例如數據庫訪問的類 JdbcTemplate 和 HTTP 請求的類 RestTemplate。