單例模式應該是大家印象最深的一種設計模式了。在Spring中最明顯的使用場景是在配置文件中配置注冊bean對象的時候設置scope的值為singleton 。
<bean class="com.bjpowernode.pojo.User" id="user" scope="singleton">
<property name="name" value="張三"></property>
</bean>
原型模式也叫克隆模式,Spring中該模式使用的很明顯,和單例一樣在bean標簽中設置scope的屬性prototype即表示該bean以克隆的方式生成
<bean class="com.bjpowernode.pojo.User" id="user" scope="prototype">
<property name="name" value="張三"></property>
</bean>
模板模式的核心是父類定義好流程,然后將流程中需要子類實現的方法就抽象話留給子類實現,Spring中的JdbcTemplate就是這樣的實現。我們知道jdbc的步驟是固定
1)加載驅動,
2)獲取連接通道,
3)構建sql語句.
4)執行sql語句,
5)關閉資源
在這些步驟中第3步和第4步是不確定的,所以就留給客戶實現,而我們實際使用JdbcTemplate的時候也確實是只需要構建SQL就可以了.這就是典型的模板模式。我們以query方法為例來看下JdbcTemplate中的代碼.
觀察者模式定義的是對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。使用比較場景是在監聽器中而spring中Observer模式常用的地方也是listener的實現。如ApplicationListener.
簡單工廠模式:就是通過工廠根據傳遞進來的參數決定產生哪個對象。Spring中我們通過getBean方法獲取對象的時候根據id或者name獲取就是簡單工廠模式了。
<context:annotation-config/>
<bean class="com.bjpowernode.pojo.User" id="user" >
<property name="name" value="張三"></property>
</bean>
工廠方法模式:在Spring中我們一般是將Bean的實例化直接交給容器去管理的,實現了使用和創建的分離,這時容器直接管理對象,還有種情況是,bean的創建過程我們交給一個工廠去實現,而Spring容器管理這個工廠。這個就是我們講的工廠模式,在Spring中有兩種實現一種是靜態工廠方法模式,一種是動態工廠方法模式。以靜態工廠來演示
/**
* User 工廠類
*
*/
public class UserFactory {
/**
* 必須是static方法
* @return
*/
public static UserBean getInstance(){
return new UserBean();
}
}
將一個類的接口轉換成客戶希望的另外一個接口。使得原本由于接口不兼容而不能一起工作的那些類可以在一起工作。這就是適配器模式。在Spring中在AOP實現中的Advice和interceptor之間的轉換就是通過適配器模式實現的。
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
@Override
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
@Override
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
// 通知類型匹配對應的攔截器
return new MethodBeforeAdviceInterceptor(advice);
}
}
裝飾者模式:裝飾者模式又稱為包裝模式(Wrapper),作用是用來動態的為一個對象增加新的功能。裝飾模式是一種用于代替繼承的技術,無須通過繼承增加子類就能擴展對象的新功能。使用對象的關聯關系代替繼承關系,更加靈活,同時避免類型體系的快速膨脹。
spring中用到的包裝器模式在類名上有兩種表現:一種是類名中含有Wrapper,另一種是類名中含有Decorator。基本上都是動態地給一個對象添加一些額外的職責。
具體的使用在Spring session框架中的SessionRepositoryRequestWrapper使用包裝模式對原生的request的功能進行增強,可以將session中的數據和分布式數據庫進行同步,這樣即使當前tomcat崩潰,session中的數據也不會丟失。
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB字節碼生成技術
策略模式:例如Resource的實現類,針對不同的資源文件,實現了不同方式的資源獲取策略。
責任鏈模式:AOP中的攔截器鏈
委托者模式:DelegatingFilterProxy,整合Shiro,SpringSecurity的時候都有用到。
橋接模式:可以根據客戶的需求能夠動態切換不同的數據源。比如我們的項目需要連接多個數據庫,客戶在每次訪問中根據需要會去訪問不同的數據庫。