詳解設計模式在Spring中的應用

設計模式作為工作學習中的枕邊書,卻時常處于勤說不用的尷尬境地,也不是我們時常忘記,只是一直沒有記憶。

今天,在IT學習者網站就設計模式的內在價值做一番探討,并以spring為例進行講解,只有領略了其設計的思想理念,才能在工作學習中運用到“無形”。

Spring作為業界的經典框架,無論是在架構設計方面,還是在代碼編寫方面,都堪稱行內典范。好了,話不多說,開始今天的內容。

spring中常用的設計模式達到九種,我們一一舉例:

第一種:簡單工廠

又叫做靜態工廠方法(StaticFactory Method)模式,但不屬于23種GOF設計模式之一。

簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類。
spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得bean對象,但是否是在傳入參數后創建還是傳入參數前創建這個要根據具體情況來定。如下配置,就是在 HelloItxxz 類中創建一個 itxxzBean。

<beans><bean id="singletonBean" class="com.itxxz.HelloItxxz"><constructor-arg><value>Hello! 這是singletonBean!value></constructor-arg></ bean><bean id="itxxzBean" class="com.itxxz.HelloItxxz"singleton="false"><constructor-arg><value>Hello! 這是itxxzBean! value></constructor-arg></bean></beans>

第二種:工廠方法(Factory Method)

通常由應用程序直接使用new創建新的對象,為了將對象的創建和使用相分離,采用工廠模式,即應用程序將對象的創建及初始化職責交給工廠對象。

一般情況下,應用程序有自己的工廠對象來創建bean.如果將應用程序自己的工廠對象交給Spring管理,那么Spring管理的就不是普通的bean,而是工廠Bean。

螃蟹就以工廠方法中的靜態方法為例講解一下:

import java.util.Random;
public class StaticFactoryBean {public static Integer createRandom() {return new Integer(new Random().nextInt());}
}

建一個config.xm配置文件,將其納入Spring容器來管理,需要通過factory-method指定靜態方法名稱

<bean id="random"
class="example.chapter3.StaticFactoryBean"
factory-method="createRandom" //createRandom方法必須是static的,才能找到
scope="prototype"
/>

測試:

public static void main(String[] args) {//調用getBean()時,返回隨機數.如果沒有指定factory-method,會返回StaticFactoryBean的實例,即返回工廠Bean的實例XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));System.out.println("我是IT學習者創建的實例:"+factory.getBean("random").toString());
}

第三種:單例模式(Singleton)

保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
spring中的單例模式完成了后半句話,即提供了全局的訪問點BeanFactory。但沒有從構造器級別去控制單例,這是因為spring管理的是是任意的java對象。
核心提示點:Spring下默認的bean均為singleton,可以通過singleton=“true|false” 或者 scope=“?”來指定

第四種:適配器(Adapter)

在Spring的Aop中,使用的Advice(通知)來增強被代理類的功能。Spring實現這一AOP功能的原理就使用代理模式(1、JDK動態代理。2、CGLib字節碼生成技術代理。)對類進行方法級別的切面增強,即,生成被代理類的代理類, 并在代理類的方法前,設置攔截器,通過執行攔截器重的內容增強了代理方法的功能,實現的面向切面編程。

Adapter類接口:Target

public interface AdvisorAdapter {boolean supportsAdvice(Advice advice);MethodInterceptor getInterceptor(Advisor advisor);}

MethodBeforeAdviceAdapter類,Adapter

class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {public boolean supportsAdvice(Advice advice) {return (advice instanceof MethodBeforeAdvice);}public MethodInterceptor getInterceptor(Advisor advisor) {MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();return new MethodBeforeAdviceInterceptor(advice);}
}

第五種:包裝器(Decorator)

在我們的項目中遇到這樣一個問題:我們的項目需要連接多個數據庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的數據庫。我們以往在spring和hibernate框架中總是配置一個數據源,因而sessionFactory的dataSource屬性總是指向這個數據源并且恒定不變,所有DAO在使用sessionFactory的時候都是通過這個數據源訪問數據庫。但是現在,由于項目的需要,我們的DAO在訪問sessionFactory的時候都不得不在多個數據源中不斷切換,問題就出現了:如何讓sessionFactory在執行數據持久化的時候,根據客戶的需求能夠動態切換不同的數據源?我們能不能在spring的框架下通過少量修改得到解決?是否有什么設計模式可以利用呢?
首先想到在spring的applicationContext中配置所有的dataSource。這些dataSource可能是各種不同類型的,比如不同的數據庫:Oracle、SQL Server、MySQL等,也可能是不同的數據源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然后sessionFactory根據客戶的每次請求,將dataSource屬性設置成不同的數據源,以到達切換數據源的目的。
spring中用到的包裝器模式在類名上有兩種表現:一種是類名中含有Wrapper,另一種是類名中含有Decorator。基本上都是動態地給一個對象添加一些額外的職責。

第六種:代理(Proxy)

為其他對象提供一種代理以控制對這個對象的訪問。

從結構上來看和Decorator模式類似,但Proxy是控制,更像是一種對功能的限制,而Decorator是增加職責。
spring的Proxy模式在aop中有體現,比如JdkDynamicAopProxy和Cglib2AopProxy。

第七種:觀察者(Observer)

定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
spring中Observer模式常用的地方是listener的實現。如ApplicationListener。

第八種:策略(Strategy)

定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。
spring中在實例化對象的時候用到Strategy模式在SimpleInstantiationStrategy中有如下代碼說明了策略模式的使用情況: 詳解設計模式在Spring中的應用

第九種:模板方法(Template Method)

定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
Template Method模式一般是需要繼承的。這里想要探討另一種對Template Method的理解。spring中的JdbcTemplate,在用這個類時并不想去繼承這個類,因為這個類的方法太多,但是我們還是想用到JdbcTemplate已有的穩定的、公用的數據庫連接,那么我們怎么辦呢?我們可以把變化的東西抽出來作為一個參數傳入JdbcTemplate的方法中。但是變化的東西是一段代碼,而且這段代碼會用到JdbcTemplate中的變量。怎么辦?那我們就用回調對象吧。在這個回調對象中定義一個操縱JdbcTemplate中變量的方法,我們去實現這個方法,就把變化的東西集中到這里了。然后我們再傳入這個回調對象到JdbcTemplate,從而完成了調用。這可能是Template Method不需要繼承的另一種實現方式吧。

以下是一個具體的例子:
JdbcTemplate中的execute方法 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

Template Method模式一般是需要繼承的。這里想要探討另一種對Template Method的理解。spring中的JdbcTemplate,在用這個類時并不想去繼承這個類,因為這個類的方法太多,但是我們還是想用到JdbcTemplate已有的穩定的、公用的數據庫連接,那么我們怎么辦呢?我們可以把變化的東西抽出來作為一個參數傳入JdbcTemplate的方法中。但是變化的東西是一段代碼,而且這段代碼會用到JdbcTemplate中的變量。怎么辦?那我們就用回調對象吧。在這個回調對象中定義一個操縱JdbcTemplate中變量的方法,我們去實現這個方法,就把變化的東西集中到這里了。然后我們再傳入這個回調對象到JdbcTemplate,從而完成了調用。這可能是Template Method不需要繼承的另一種實現方式吧。

以下是一個具體的例子:
JdbcTemplate中的execute方法
詳解設計模式在Spring中的應用
JdbcTemplate執行execute方法
詳解設計模式在Spring中的應用

轉載于:https://blog.51cto.com/13919357/2375044

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開大你的音響,感受HTML5 Audio API帶來的視聽盛宴

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 話說HTML5的炫酷真的是讓我愛不釋手&#xff0c;即使在這個提到IE就傷心不完的年代。但話又說回來&#xff0c;追求卓越Web創造更美世界…

Microsoft Visual Studio 2010(vs2010) 中文版安裝

Microsoft Visual Studio 2010(vs2010) 中文版安裝 日期&#xff1a;2019-05-12 時間&#xff1a;20:03:36 編輯&#xff1a;張國富 下載地址 基本簡介 Microsoft Visual Studio&#xff08;vs2010是簡稱&#xff09;是微軟公司推出的開發環境。visual studio 2010…

JVM的幾點性能優化

HotSpot&#xff0c;家喻戶曉的JVM&#xff0c;我們的Java和Scala程序就運行在它上面。年復一年&#xff0c;一次又一次的迭代&#xff0c;經過無數工程師的不斷優化&#xff0c;現在它的代碼執行的速度和效率已經逼近本地編譯的代碼了。 它的核心是一個JIT&#xff08;Just-I…

IDEA配置 及 快捷鍵

出處&#xff1a; https://www.cnblogs.com/hero123/p/10120552.html 快捷鍵&#xff1a; 格式化代碼 CtrlaltL 后退Ctrlalt <- 格式化代碼快捷鍵&#xff1a;Ctrl Alt L 刪除整行&#xff1a;CtrlX 實現類 ctrl alt CtrlN 查找類 CtrlShiftN 查找文件 CTRLSHIFTALTN 查找…

LeetCode Decode Ways

123123轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/10854545.html

SpringBoot 之集成 Spring AOP

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在開始之前&#xff0c;我們先把需要的jar包添加到工程里。新增Maven依賴如下&#xff1a; <dependency><groupId>org.spri…

9件事把你從消極情緒中解救出來

也許你很難相信&#xff0c;但是情緒可以通過重復形成習慣。消極情緒甚至可以變成某種嵌入你每日生活的東西。 如何將它們趕跑? 你發現你不斷地埋怨世界和自己?你可以輕易地生氣并且對人變得刻薄?那憤怒又是否成為你對事情本能的回應了?如果你對所述問題中的一個回答了“是…

數據庫主鍵自增插入顯示值

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主同意不得轉載。 https://blog.csdn.net/nwsuaf2009012882/article/details/32703597 SQL Server 2008 數據庫主鍵自增插入顯示值 前幾天在工作的時候遇到在刪除數據庫中表的數據的時候。刪除之后&#xff0c;又一次…

解決: This application has no explicit mapping for /error, so you are seeing this as a fallback.

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff0c;出現這個異常說明了跳轉頁面的url無對應的值. 原因1: Application啟動類的位置不對.要將Application類放在最外側…

Selenium自動化獲取WebSocket信息

性能日志 ChromeDriver支持性能日志記錄&#xff0c;您可以從中獲取域“時間軸”&#xff0c;“網絡”和“頁面”的事件&#xff0c;以及指定跟蹤類別的跟蹤數據。啟用性能日志 默認情況下不啟用性能日志記錄。因此&#xff0c;在創建新會話時&#xff0c;您必須啟用它。 Desir…

零負債之人的10個習慣

無論你是已下定決心要于今年實現零負債&#xff0c;還是距離這個目標的實現有很長的路要走&#xff0c;能受到啟發總是好事。 看看你認識的已經過上“無債一身輕”生活的人──朋友、家人、同事或是你認為可能與其他無負債之人具有類似品質的人。 下文為無負債之人的10個共同…

《App后臺開發運維與架構實踐》第3章 App后臺核心技術

2019獨角獸企業重金招聘Python工程師標準>>> 3.1 用戶驗證方案 3.1.1 使用HTTPS協議 HTTPS協議是“HTTP協議”和“SSL/TLS”的組合。SSL&#xff08;Secure Sockets Layer&#xff09;&#xff0c;即安全套接層&#xff0c;是為了解決因HTTP協議是明文而導致傳輸內容…

IntelliJ IDEA 配置 JDK

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 提前安裝jdk&#xff0c;配置環境變量 一、配置jdk 1、依次點開File -->Project Structure&#xff0c;點擊左側標簽頁&#xff0c…

xml編輯無提示?這么破!

在學習testng這個單元測試框架時&#xff0c;如果咱們碰到了編輯測試套件xml&#xff0c;不提示的情況&#xff08;有提示方便咱們學習&#xff0c;并且testng的測試套件定義必須按照他的dtd文件約束來&#xff09;&#xff0c;咱們可以按照下面的步驟去解決這個問題。 1.檢查t…

“云棲直播”升級為“公開課”

直播平臺是面向廣大開發者的視頻學習平臺&#xff0c;幫助廣大開發者學習最新技術&#xff0c;了解最新阿里云產品以及最新技術發展趨勢&#xff0c;幫助開發者們不斷學習與成長。截止到2019年3月&#xff0c;直播共進行800余場&#xff0c;觀看人次100萬。  社區將對“云棲直…

遭銀行賬號詐騙最快最有效自救法

銀行卡或賬戶詐騙案件層出不窮&#xff0c;當匯錯款時該怎么做&#xff0c;切記以下方法&#xff1a; 一、當匯錯款或被騙匯款后&#xff0c;最快最有效的緊急自救法&#xff1a;當你把自己的錢不小心匯到了不該匯的人卡上&#xff0c;或者被騙子忽悠而把錢匯給了騙子&#xf…

SQL 判斷非空 NULL :IFNUL( ) 、COALESCE( ) 、ISNULL( ) 、NVL( )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. mysql 支持&#xff1a; IFNULL&#xff08;&#xff09;、COALESCE&#xff08;&#xff09; 如 IFNULL(UnitsOnOrder, 0) 或者 CO…

navigator.geolocation的應用 - 將定位信息顯示在百度地圖上

在學習navigator.geolocation的時候&#xff0c;有一個實例是獲取坐標后顯示在谷歌地圖上。眾所周知&#xff0c;谷歌地圖國內并不能直接訪問&#xff0c;得用特殊手段&#xff0c;那我要測試的時候還要開著梯子挺麻煩的&#xff0c;想給別人用也得那個人能訪問谷歌地圖先。 地…

centos7 mysql數據庫安裝和配置

2019獨角獸企業重金招聘Python工程師標準>>> 一、系統環境 yum update升級以后的系統版本為 [rootyl-web yl]# cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) 二、mysql安裝 一般網上給出的資料都是 #yum install mysql #yum install mysql-serve…

5種聰明工作法

1、每天最多做三件事 請拿出你落落長的待辦清單&#xff0c;圈出最重要的一~三件事&#xff0c;然后給自己一天的時間&#xff0c;卯足全力解決它! 你不需要因為還有很多事要做而焦慮&#xff0c;只需要專注今天、當下、以及最重要的問題。 《與成功有約》作者史蒂芬.柯維(Step…