javascript
SpringMVC学习(四)——Spring使用到的设计模式分析
文章目錄
- 1、引言
- 2、Spring常用的設計模式(先留坑,慢慢補充)
- 2.1 簡單工廠模式
- 2.2 工廠方法模式
- 2.3 適配器模式
- 2.4 裝飾器模式(包裝器模式)
- 2.5 代理模式
- 2.6 觀察者模式
- 2.6.1、先定義一個Event
- 2.6.2、先定義事件的抽象實現
- 2.6.3、再定義各個具體的事件的實現
- 2.6.4、事件監聽器定義
- 2.6.5、各個事件監聽器的實現
- 2.6.6、事件廣播的實現
- 2.6.7、測試代碼以及日志
- 2.7 策略模式
- 2.8 模板方法模式
1、引言
本文主要是分析Spring框架中使用到的哪些設計模式,我們都知道無論是SpringMVC、SpringBoot、SpringCloud這些框架的核心都是Spring,本篇文章就結合一些源碼以及測試的例子講解Spring框架中使用的設計模式。
相關代碼請參考: chapter-4-springmvc-sourcecode-analysis
https://gitee.com/leo825/spring-framework-learning-example.git
2、Spring常用的設計模式(先留坑,慢慢補充)
2.1 簡單工廠模式
Spring中用到的簡單工廠模式就是我們經常用到的BeanFactory。
2.2 工廠方法模式
Spring中用到的工廠方法模式就是FactoryBean。
2.3 適配器模式
Spring中的攔截器就用到了適配器模式。
2.4 裝飾器模式(包裝器模式)
Spring中的各種Wrapper和Decorator就用到了裝飾器模式。
2.5 代理模式
Spring中的AOP就用到了代理模式,代理模式有兩種實現:JDK動態代理、Cglib動態代理。
2.6 觀察者模式
Spring中的ApplicationListener就用到了觀察者模式。Spring中使用的觀察者最多的就是通過事件響應方式。以下是簡單舉一個觀察者實現的例子:
業務場景:訂單訂購成功之后,
1、需要調用訂單同步接口
2、需要調用計費同步接口
3、需要調用訂單審核接口等等
以往的寫法寫一個同步大方法: 訂單同步方法 -> 計費同步方法 ->訂單審核方法 等等。
現在換一種思路,通過事件響應的方式,如果完成了訂購之后可以通過觀察者通知的方式,繼續以后的操作。
具體步驟如下:
2.6.1、先定義一個Event
首先,定義一個事件的接口。
public interface Event extends Serializable{/*** 設置事處理對象* @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、先定義事件的抽象實現
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、再定義各個具體的事件的實現
/*** @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、事件監聽器定義
/*** @ClassName: Listener* @Description: 定義事件的監聽器* @Author: leo825* @Date: 2020-02-17 00:18* @Version: 1.0*/ public interface EventListener {void onEvent(Event event);int getSort(); }同樣事件監聽器也提供一個抽象類
public abstract class AbstractEventListener implements EventListener {/*** 監聽器的名稱*/private String name;/*** 監聽器執行的順序*/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、各個事件監聽器的實現
/*** @ClassName: AuditingSynListener* @Description: 審核同步監聽器* @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: 計費同步監聽器* @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: 訂單同步監聽器* @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、事件廣播的實現
/*** @ClassName: EventMulticaster* @Description: 事件廣播器* @Author: leo825* @Date: 2020-02-17 00:34* @Version: 1.0*/ public class EventMulticaster {/*** 監聽器列表*/private static List<EventListener> listeners = new ArrayList<>();/*** 添加監聽器** @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);//創建了一個訂單EventObject eventObject = new EventObject("1","12306訂單",null);//創建訂單事件OrderSynEvent orderSynEvent = new OrderSynEvent(eventObject);//開始廣播事件eventMulticaster.muticasterEvent(orderSynEvent);}日志如下:
[2020-02-25 12:44:49.596] 訂單創建完成了,觸發訂單同步事件OrderSynEvent [2020-02-25 12:44:49.600] BillingSynListener監聽到訂單同步事件,event=com.leo.event.OrderSynEvent@1c6b6478 [2020-02-25 12:44:49.604] OrderSynListener監聽到訂單同步事件,event=com.leo.event.OrderSynEvent@1c6b6478 [2020-02-25 12:44:49.609] AuditingSynListener監聽到訂單同步事件,event=com.leo.event.OrderSynEvent@1c6b64782.7 策略模式
Sping在實例化對象的時候就用到了策略模式
2.8 模板方法模式
Spring中的JdbcTemplate、RestTemplate、RedisTemplate
總結
以上是生活随笔為你收集整理的SpringMVC学习(四)——Spring使用到的设计模式分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring核心——Bean的生命周期
- 下一篇: Spring源码分析——Bean的生命周