Spring做爲業界的經典框架,不管是在架構設計方面,仍是在代碼編寫方面,都堪稱行內典範。好了,話很少說,開始今天的內容。java
spring中經常使用的設計模式達到九種。算法
spring的jdbc模板,對Spring源碼的精妙真是佩服得五體投地,極爲經典。spring
spring中真是集設計模式之大成,並且用得是爐火純青。模板方法(template method)就在spring中被大量使用,如:jdbcTemplate,hibernateTemplate,JndiTemplate以及一些包圍的包裝等都無疑使用了模板模式,但spring並非單純使用了模板方法,而是在此基礎上作了創新,配合callback(回調)一塊兒使用,用得極其靈活。數據庫
所謂模板板式,就是在父類中定義算法的主要流程,而把一些個性化的步驟延遲到子類中去實現,父類始終控制着整個流程的主動權,子類只是輔助父類實現某些可定製的步驟。apache
所謂回調,就是方法參數中傳遞一個接口,父類在調用此方法時,必須調用方法中傳遞的接口的實現類。編程
如下是一個具體的例子,JdbcTemplate中的execute方法。設計模式
上面所述僅僅是Spring JdbcTemplte實現的基本原理,Spring JdbcTemplate內部還作了更多的事情,好比,把全部的基本操做都封裝到JdbcOperations接口內,以及採用JdbcAccessor來管理DataSource和轉換異常等。session
策略模式是對算法的包裝,把使用算法的責任和算法自己分隔開,委派給不一樣的對象管理。策略模式一般把一系列的算法包裝到一系列的策略類裏面,做爲一個抽象策略類的子類。架構
spring中在實例化對象的時候用到Strategy模式,在SimpleInstantiationStrategy中有以下代碼說明了策略模式的使用狀況。app
又叫作靜態工廠方法(StaticFactory Method)模式,但不屬於23種GOF設計模式之一。
簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該建立哪個產品類。
spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個惟一的標識來得到bean對象,可是否是在傳入參數後建立仍是傳入參數前建立這個要根據具體狀況來定。以下配置,就是在 HelloItxxz 類中建立一個 itxxzBean。
<beans>
一般由應用程序直接使用new建立新的對象,爲了將對象的建立和使用相分離,採用工廠模式,即應用程序將對象的建立及初始化職責交給工廠對象。
通常狀況下,應用程序有本身的工廠對象來建立bean.若是將應用程序本身的工廠對象交給Spring管理,那麼Spring管理的就不是普通的bean,而是工廠Bean。
就以工廠方法中的靜態方法爲例講解一下。
import java.util.Random;
建一個config.xm配置文件,將其歸入Spring容器來管理,須要經過factory-method指定靜態方法名稱。
<bean id="random"
測試:
public static void main(String[] args) {
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
spring中的單例模式完成了後半句話,即提供了全局的訪問點BeanFactory。但沒有從構造器級別去控制單例,這是由於spring管理的是是任意的java對象。
核心提示點:Spring下默認的bean均爲singleton,能夠經過singleton=「true|false」 或者 scope=「?」來指定。
在Spring的Aop中,使用的Advice(通知)來加強被代理類的功能。
Spring實現這一AOP功能的原理就使用代理模式。
一、JDK動態代理。
二、CGLib字節碼生成技術代理。
對類進行方法級別的切面加強,即,生成被代理類的代理類, 並在代理類的方法前,設置攔截器,經過執行攔截器重的內容加強了代理方法的功能,實現的面向切面編程。
public interface AdvisorAdapter {
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
爲其餘對象提供一種代理以控制對這個對象的訪問。
從結構上來看和Decorator模式相似,但Proxy是控制,更像是一種對功能的限制,而Decorator是增長職責。
spring的Proxy模式在aop中有體現,好比JdkDynamicAopProxy和Cglib2AopProxy。
也叫包裝器模式(Wrapper)。GOF在《設計模式》一書中給出的定義爲:動態地給一個對象添加一些額外的職責。就增長功能來講,Decorator模式相比生成子類更爲靈活。
在咱們的項目中遇到這樣一個問題:咱們的項目須要鏈接多個數據庫,並且不一樣的客戶在每次訪問中根據須要會去訪問不一樣的數據庫。
這裏,你會首先想到得是在spring的applicationContext中配置全部的dataSource。這些dataSource多是各類不一樣類型的,好比不一樣的數據庫:Oracle、SQL Server、MySQL等,也多是不一樣的數據源:好比apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。而後sessionFactory根據客戶的每次請求,將dataSource屬性設置成不一樣的數據源,以到達切換數據源的目的。
Spring中用到的包裝器模式在類名上有兩種表現:一種是類名中含有Wrapper,另外一種是類名中含有Decorator。基本上都是動態地給一個對象添加一些額外的職責。
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。
spring中Observer模式經常使用的地方是listener的實現。如ApplicationListener。
看到這裏還沒過癮,那麼就來羣裏與更多的同窗交流切磋技術,戳這裏:我們來一塊兒抱團取暖,好嗎?【Java高級互聯網架構:964357187】