日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC学习(四)——Spring使用到的设计模式分析

發(fā)布時間:2025/3/19 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC学习(四)——Spring使用到的设计模式分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

        • 1、引言
        • 2、Spring常用的設(shè)計模式(先留坑,慢慢補充)
          • 2.1 簡單工廠模式
          • 2.2 工廠方法模式
          • 2.3 適配器模式
          • 2.4 裝飾器模式(包裝器模式)
          • 2.5 代理模式
          • 2.6 觀察者模式
            • 2.6.1、先定義一個Event
            • 2.6.2、先定義事件的抽象實現(xiàn)
            • 2.6.3、再定義各個具體的事件的實現(xiàn)
            • 2.6.4、事件監(jiān)聽器定義
            • 2.6.5、各個事件監(jiān)聽器的實現(xiàn)
            • 2.6.6、事件廣播的實現(xiàn)
            • 2.6.7、測試代碼以及日志
        • 2.7 策略模式
          • 2.8 模板方法模式

1、引言

本文主要是分析Spring框架中使用到的哪些設(shè)計模式,我們都知道無論是SpringMVC、SpringBoot、SpringCloud這些框架的核心都是Spring,本篇文章就結(jié)合一些源碼以及測試的例子講解Spring框架中使用的設(shè)計模式。
相關(guān)代碼請參考: chapter-4-springmvc-sourcecode-analysis
https://gitee.com/leo825/spring-framework-learning-example.git

2、Spring常用的設(shè)計模式(先留坑,慢慢補充)

2.1 簡單工廠模式

Spring中用到的簡單工廠模式就是我們經(jīng)常用到的BeanFactory。

2.2 工廠方法模式

Spring中用到的工廠方法模式就是FactoryBean。

2.3 適配器模式

Spring中的攔截器就用到了適配器模式。

2.4 裝飾器模式(包裝器模式)

Spring中的各種Wrapper和Decorator就用到了裝飾器模式。

2.5 代理模式

Spring中的AOP就用到了代理模式,代理模式有兩種實現(xiàn):JDK動態(tài)代理、Cglib動態(tài)代理。

2.6 觀察者模式

Spring中的ApplicationListener就用到了觀察者模式。Spring中使用的觀察者最多的就是通過事件響應(yīng)方式。以下是簡單舉一個觀察者實現(xiàn)的例子:
業(yè)務(wù)場景:訂單訂購成功之后,
1、需要調(diào)用訂單同步接口
2、需要調(diào)用計費同步接口
3、需要調(diào)用訂單審核接口等等
以往的寫法寫一個同步大方法: 訂單同步方法 -> 計費同步方法 ->訂單審核方法 等等。
現(xiàn)在換一種思路,通過事件響應(yīng)的方式,如果完成了訂購之后可以通過觀察者通知的方式,繼續(xù)以后的操作。
具體步驟如下:

2.6.1、先定義一個Event

首先,定義一個事件的接口。

public interface Event extends Serializable{/*** 設(shè)置事處理對象* @param eventObject*/void setEventObject(EventObject eventObject);EventObject getEventObject(); }

其中事件的對象如下:

/*** @ClassName: EventObject* @Description: 事件處理的對象類* @Author: leo825* @Date: 2020-02-16 23:45* @Version: 1.0*/ public class EventObject implements Serializable{/*** 對象的id*/private String id;/*** 對象的名稱*/private String name;/*** 對象攜帶信息*/private Map<String, Object> info;public EventObject(String id, String name, Map<String, Object> info) {this.id = id;this.name = name;this.info = info;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Map<String, Object> getInfo() {return info;}public void setInfo(Map<String, Object> info) {this.info = info;}@Overridepublic String toString() {return "EventObject{" +"id='" + id + '\'' +", name='" + name + '\'' +", info=" + info +'}';} }
2.6.2、先定義事件的抽象實現(xiàn)
public abstract class AbstractEvent implements Event {private static final long serialVersionUID = 1L;/*** 事件處理的對象*/private EventObject eventObject;public AbstractEvent(EventObject eventObject) {this.eventObject = eventObject;}@Overridepublic void setEventObject(EventObject eventObject) {this.eventObject = eventObject;}@Overridepublic EventObject getEventObject() {return this.eventObject;} }
2.6.3、再定義各個具體的事件的實現(xiàn)
/*** @ClassName: AuditingSynEvent* @Description: 審核同步事件* @Author: leo825* @Date: 2020-02-17 00:06* @Version: 1.0*/ public class AuditingSynEvent extends AbstractEvent{public AuditingSynEvent(EventObject eventObject) {super(eventObject);} } /*** @ClassName: OrderSynEvent* @Description: 訂單同步事件* @Author: leo825* @Date: 2020-02-17 00:04* @Version: 1.0*/ public class OrderSynEvent extends AbstractEvent{public OrderSynEvent(EventObject eventObject) {super(eventObject);} } /*** @ClassName: BillingSynEvent* @Description: 計費同步事件* @Author: leo825* @Date: 2020-02-17 00:06* @Version: 1.0*/ public class BillingSynEvent extends AbstractEvent{public BillingSynEvent(EventObject eventObject) {super(eventObject);} }
2.6.4、事件監(jiān)聽器定義
/*** @ClassName: Listener* @Description: 定義事件的監(jiān)聽器* @Author: leo825* @Date: 2020-02-17 00:18* @Version: 1.0*/ public interface EventListener {void onEvent(Event event);int getSort(); }

同樣事件監(jiān)聽器也提供一個抽象類

public abstract class AbstractEventListener implements EventListener {/*** 監(jiān)聽器的名稱*/private String name;/*** 監(jiān)聽器執(zhí)行的順序*/private int sort;public String getName() {return name;}@Overridepublic int getSort() {return sort;}public void setName(String name) {this.name = name;}public void setSort(int sort) {this.sort = sort;}public AbstractEventListener(String name, Integer sort) {this.name = name;this.sort = sort;} }
2.6.5、各個事件監(jiān)聽器的實現(xiàn)
/*** @ClassName: AuditingSynListener* @Description: 審核同步監(jiān)聽器* @Author: leo825* @Date: 2020-02-17 00:31* @Version: 1.0*/ public class AuditingSynListener extends AbstractEventListener{public AuditingSynListener(String name, Integer sort) {super(name, sort);}@Overridepublic void onEvent(Event event) {System.out.println("這個是審核同步事件");System.out.println(event);} } /*** @ClassName: BillingSynListener* @Description: 計費同步監(jiān)聽器* @Author: leo825* @Date: 2020-02-17 00:30* @Version: 1.0*/ public class BillingSynListener extends AbstractEventListener {public BillingSynListener(String name, Integer sort) {super(name, sort);}@Overridepublic void onEvent(Event event) {System.out.println("這個是計費同步事件");System.out.println(event);} } /*** @ClassName: OrderSynListener* @Description: 訂單同步監(jiān)聽器* @Author: leo825* @Date: 2020-02-17 00:24* @Version: 1.0*/ public class OrderSynListener extends AbstractEventListener {public OrderSynListener(String name, Integer sort) {super(name, sort);}@Overridepublic void onEvent(Event event) {System.out.println("這個是訂單同步事件");System.out.println(event);} }
2.6.6、事件廣播的實現(xiàn)
/*** @ClassName: EventMulticaster* @Description: 事件廣播器* @Author: leo825* @Date: 2020-02-17 00:34* @Version: 1.0*/ public class EventMulticaster {/*** 監(jiān)聽器列表*/private static List<EventListener> listeners = new ArrayList<>();/*** 添加監(jiān)聽器** @param eventListener* @return*/public EventMulticaster addListener(AbstractEventListener eventListener) {listeners.add(eventListener);listeners = listeners.stream().sorted(Comparator.comparing(EventListener::getSort)).collect(Collectors.toList());return this;}/*** 廣播事件** @param event*/public void muticasterEvent(Event event) {for (EventListener eventListener : listeners) {eventListener.onEvent(event);}} }
2.6.7、測試代碼以及日志
@Testpublic void muticasterTest() {OrderSynListener orderSynListener = new OrderSynListener("orderSyn", 2);BillingSynListener billingSynListener = new BillingSynListener("billingSyn", 1);AuditingSynListener auditingSynListener = new AuditingSynListener("auditingSyn", 3);EventMulticaster eventMulticaster = new EventMulticaster();eventMulticaster.addListener(orderSynListener).addListener(billingSynListener).addListener(auditingSynListener);//創(chuàng)建了一個訂單EventObject eventObject = new EventObject("1","12306訂單",null);//創(chuàng)建訂單事件OrderSynEvent orderSynEvent = new OrderSynEvent(eventObject);//開始廣播事件eventMulticaster.muticasterEvent(orderSynEvent);}

日志如下:

[2020-02-25 12:44:49.596] 訂單創(chuàng)建完成了,觸發(fā)訂單同步事件OrderSynEvent [2020-02-25 12:44:49.600] BillingSynListener監(jiān)聽到訂單同步事件,event=com.leo.event.OrderSynEvent@1c6b6478 [2020-02-25 12:44:49.604] OrderSynListener監(jiān)聽到訂單同步事件,event=com.leo.event.OrderSynEvent@1c6b6478 [2020-02-25 12:44:49.609] AuditingSynListener監(jiān)聽到訂單同步事件,event=com.leo.event.OrderSynEvent@1c6b6478

2.7 策略模式

Sping在實例化對象的時候就用到了策略模式

2.8 模板方法模式

Spring中的JdbcTemplate、RestTemplate、RedisTemplate

總結(jié)

以上是生活随笔為你收集整理的SpringMVC学习(四)——Spring使用到的设计模式分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。