国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從源碼Debug深入spring事件機(jī)制,基于觀察者模式仿寫(xiě)spring事件監(jiān)聽(tīng)骨架

這篇具有很好參考價(jià)值的文章主要介紹了從源碼Debug深入spring事件機(jī)制,基于觀察者模式仿寫(xiě)spring事件監(jiān)聽(tīng)骨架。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.測(cè)試案例

定義一個(gè)事件

package com.example.demo.event;
import org.springframework.context.ApplicationEvent;

public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
    }
}

定義兩個(gè)listener

package com.example.demo.event;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class Listener1 implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        String source = (String) event.getSource();
        System.out.println(this.getClass().getName() + ":" + source);
    }
}
package com.example.demo.event;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class Listener2 implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        String source = (String) event.getSource();
        System.out.println(this.getClass().getName() + ":" + source);
    }
}

注入spring容器里的ApplicationEventPublisher對(duì)象,發(fā)布事件

package com.example.demo;


import com.example.demo.event.MyEvent;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest
public class EventPublisherTest {

    @Resource
    private ApplicationEventPublisher eventPublisher;

    @Test
    public void test() {
        eventPublisher.publishEvent(new MyEvent("xxx"));
    }
}

2.DEBUG源碼分析

eventPublisher.publishEvent(new MyEvent("xxx"));進(jìn)去很容易就能找到,可以發(fā)現(xiàn)SimpleApplicationEventMulticaster這個(gè)事件發(fā)布對(duì)象持有所有l(wèi)istenter對(duì)象及MyEvent對(duì)象,
事件發(fā)布過(guò)程其實(shí)就是遍歷拿到每個(gè)listener對(duì)象并調(diào)用它自己的onApplicationEvent()方法

SimpleApplicationEventMulticaster類的主要方法:

  • addApplicationListener(ApplicationListener<?> listener) :
  • addApplicationListenerBean(String listenerBeanName):
  • removeApplicationListener(ApplicationListener<?> listener):
  • removeApplicationListenerBean(String listenerBeanName):
  • multicastEvent(ApplicationEvent event):廣播事件;
  • multicastEvent(ApplicationEvent event, @Nullable
    ResolvableType eventType):廣播事件,指定事件的source類型。

從源碼Debug深入spring事件機(jī)制,基于觀察者模式仿寫(xiě)spring事件監(jiān)聽(tīng)骨架,觀察者模式,java,spring event

3. 異步監(jiān)聽(tīng)

從上圖斷點(diǎn)可以看到ApplicationEventMulticaster對(duì)象持有有taskExecutor字段為null,導(dǎo)致沒(méi)有異步執(zhí)行所有監(jiān)聽(tīng)器。這里需要想辦法這個(gè)字段設(shè)置線程池即可:
springboot默認(rèn)會(huì)配置一個(gè)ThreadPoolTaskExecutor對(duì)象在容器里,這里把它拿出來(lái)設(shè)置給ApplicationEventMulticaster對(duì)象即可

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;


/**
 * @author Administrator
 */
@SpringBootApplication
public class DemoApplication {

    @Resource
    private SimpleApplicationEventMulticaster eventMulticaster;
    @Resource
    private ThreadPoolTaskExecutor executor;

    @PostConstruct
    public void setEventExecutor() {
        eventMulticaster.setTaskExecutor(executor);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

4.ApplicationListener子接口

還可以實(shí)現(xiàn)子類的getOrder方法可以實(shí)現(xiàn)多個(gè)監(jiān)聽(tīng)器排序;實(shí)現(xiàn)supportsEventType,supportsSourceType可以實(shí)現(xiàn)按過(guò)濾Class過(guò)來(lái)或按事件源Source的Class過(guò)濾
從源碼Debug深入spring事件機(jī)制,基于觀察者模式仿寫(xiě)spring事件監(jiān)聽(tīng)骨架,觀察者模式,java,spring event

5. 注解支持

這里不通過(guò)實(shí)現(xiàn)接口來(lái)實(shí)現(xiàn)監(jiān)聽(tīng),順序排序,按事件類型過(guò)濾監(jiān)聽(tīng),采用更方便的注解實(shí)現(xiàn),且一個(gè)類中就可以實(shí)現(xiàn)多個(gè)監(jiān)聽(tīng)

package com.example.demo.event;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
public class Listener3 {

    @Order(Integer.MIN_VALUE) // 優(yōu)先級(jí)最高
    @EventListener(MyEvent.class)  // 只監(jiān)聽(tīng)指定類型的事件
    public void onApplicationEvent(ApplicationEvent event) {
        MyEvent myEvent = (MyEvent) event;
        System.out.println(this.getClass().getName() + ":" + myEvent.getSource());
    }
}

6. 基于觀察者模式高仿spring事件監(jiān)聽(tīng)

6.1 先定義自定義一個(gè)事件

Java中已定義觀察者模式事件及監(jiān)聽(tīng)器頂級(jí)接口

package com.example.demo.javanativeevent;

import java.util.EventObject;

public class MyJavaNativeEvent extends EventObject {

    public MyJavaNativeEvent(Object source) {
        super(source);
    }
}

6.2 定義兩個(gè)監(jiān)聽(tīng)器

因?yàn)镴ava提供的EventListener無(wú)具體監(jiān)聽(tīng)方法,且無(wú)合適的子接口,故這里自定義一個(gè)類似spirng的子接口NativeEventListener。這樣后續(xù)事件發(fā)布就是遍歷這種類型接口并調(diào)用onApplicationEvent()方法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655887.html

package com.example.demo.javanativeevent;

import java.util.EventListener;
import java.util.EventObject;

public interface NativeEventListener extends EventListener {
    void onApplicationEvent(EventObject event);
}
package com.example.demo.javanativeevent;

import java.util.EventObject;


public class JavaNativeListener1 implements NativeEventListener {

    @Override
    public void onApplicationEvent(EventObject event){
        String source = (String)event.getSource();
        System.out.println(this.getClass().getName()+":"+source);
    }
}

6.3 定義一個(gè)持有所有監(jiān)聽(tīng)器的對(duì)象,類似spring的SimpleApplicationEventMulticaster

package com.example.demo.javanativeevent;

import java.util.ArrayList;
import java.util.Collections;
import java.util.EventObject;
import java.util.List;

/**
 * TODO
 *
 * @author majun
 * @version 1.0
 * @since 2023-08-13 18:50
 */
public class SimpleJavaNativeEventMulticaster {

    public List<NativeEventListener> eventListeners= Collections.synchronizedList(new ArrayList<>(8));


    public void addListener(NativeEventListener listener){
        this.eventListeners.add(listener);
    }
    public void multicastEvent(EventObject eventObject){
        eventListeners.stream().parallel().forEach(listener -> {
           listener.onApplicationEvent(eventObject);
        });
    }
}

6.4 事件發(fā)布測(cè)試

package com.example.demo.javanativeevent;

/**
 * TODO
 *
 * @author majun
 * @version 1.0
 * @since 2023-08-13 19:01
 */
public class EventPublishTest {


    public static void main(String[] args) {
        // 注冊(cè)兩個(gè)listener,這是spirng把這個(gè)過(guò)程隱藏在spring容器初始化過(guò)程中了
        SimpleJavaNativeEventMulticaster eventMulticaster = new SimpleJavaNativeEventMulticaster();
        eventMulticaster.addListener(new JavaNativeListener1());
        eventMulticaster.addListener(new JavaNativeListener2());
        // 發(fā)布事件
        eventMulticaster.multicastEvent(new MyJavaNativeEvent("yyyy"));
    }
}

到了這里,關(guān)于從源碼Debug深入spring事件機(jī)制,基于觀察者模式仿寫(xiě)spring事件監(jiān)聽(tīng)骨架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [Unity] No.3 EventManager事件管理 與 觀察者模式

    前文講到了InputManager,在其后需要一個(gè)事件的管理者用于調(diào)度任務(wù)的執(zhí)行,包括: ①查看發(fā)生了什么事; ②出事后看看都需要通知誰(shuí)干什么事; 以上兩個(gè)內(nèi)容就對(duì)應(yīng)了EventManager中關(guān)鍵的 監(jiān)聽(tīng) 和 回調(diào) ,而在講EventManager之前還需要知道,它是符合觀察者這一模式的。 此處不

    2024年02月08日
    瀏覽(21)
  • 深入理解設(shè)計(jì)模式-行為型之觀察者

    觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種 一對(duì)多的依賴關(guān)系 ,讓 多個(gè)觀察者對(duì)象 同時(shí)監(jiān)聽(tīng)一個(gè) 主題對(duì)象 ,當(dāng) 主題對(duì)象 發(fā)生 變化 時(shí),所有依賴于它的 觀察者 對(duì)象都會(huì)得到 通知并更新。 在觀察者模式中,有兩個(gè)主要角色: Subject(主題):維護(hù)

    2024年02月12日
    瀏覽(27)
  • Spring Event 觀察者模式, 業(yè)務(wù)解耦神器

    Spring Event 觀察者模式, 業(yè)務(wù)解耦神器

    觀察者模式在實(shí)際開(kāi)發(fā)過(guò)程中是非常常見(jiàn)的一種設(shè)計(jì)模式。 Spring Event的原理就是觀察者模式,只不過(guò)有Spring的加持,讓我們更加方便的使用這一設(shè)計(jì)模式。 概念 : 觀察者模式又叫發(fā)布-訂閱模式。 發(fā)布指的是當(dāng)目標(biāo)對(duì)象的狀態(tài)改變時(shí),它就向它所有的觀察者對(duì)象發(fā)布 狀態(tài)更

    2024年02月08日
    瀏覽(17)
  • 性能優(yōu)化之懶加載 - 基于觀察者模式和單例模式的實(shí)現(xiàn)

    性能優(yōu)化之懶加載 - 基于觀察者模式和單例模式的實(shí)現(xiàn)

    ? ? ? ? 在前端性能優(yōu)化中,關(guān)于圖片/視頻等內(nèi)容的懶加載一直都是優(yōu)化利器。當(dāng)用戶看到對(duì)應(yīng)的視圖模塊時(shí),才去請(qǐng)求加載對(duì)應(yīng)的圖像。 原理也很簡(jiǎn)單,通過(guò)瀏覽器提供的?IntersectionObserver - Web API 接口參考 | MDN (mozilla.org),觀察“哪個(gè)元素和視口交叉”,從而進(jìn)行懶加載。

    2024年02月05日
    瀏覽(25)
  • 【C++ 觀察者模式 思想理解】C++中的觀察者模式:松耦合設(shè)計(jì)與動(dòng)態(tài)交互的藝術(shù),合理使用智能指針觀察者

    【C++ 觀察者模式 思想理解】C++中的觀察者模式:松耦合設(shè)計(jì)與動(dòng)態(tài)交互的藝術(shù),合理使用智能指針觀察者

    在進(jìn)入技術(shù)細(xì)節(jié)之前,理解觀察者模式(Observer Pattern)的基本概念和它在現(xiàn)代編程中的重要性是至關(guān)重要的。 觀察者模式是一種設(shè)計(jì)模式,它定義了對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)更新。在C++中,這個(gè)

    2024年01月24日
    瀏覽(48)
  • 觀察者模式(上):詳解各種應(yīng)用場(chǎng)景下觀察者模式的不同實(shí)現(xiàn)方式

    ????????從今天起,我們開(kāi)始學(xué)習(xí)行為型設(shè)計(jì)模式。我們知道,創(chuàng)建型設(shè)計(jì)模式主要解決“對(duì)象的創(chuàng)建”問(wèn)題,結(jié)構(gòu)型設(shè)計(jì)模式主要解決“類或?qū)ο蟮慕M合或組裝”問(wèn)題,那行為型設(shè)計(jì)模式主要解決的就是“ 類或?qū)ο笾g的交互 ”問(wèn)題。 原理及應(yīng)用場(chǎng)景剖析 在對(duì)象之間

    2024年02月16日
    瀏覽(85)
  • 觀察者設(shè)計(jì)模式

    觀察者設(shè)計(jì)模式

    行為型模式(Behavioral Patterns):這類模式主要關(guān)注對(duì)象之間的通信。它們 分別是: 職責(zé)鏈模式(Chain of Responsibility) 命令模式(Command) 解釋器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 備忘錄模式(Memento) 觀察者模式(Observer) 狀態(tài)模式(State) 策略

    2024年01月24日
    瀏覽(25)
  • 觀察者模式(C++)

    觀察者模式(C++)

    定義對(duì)象間的一種一對(duì)多(變化)的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象(Subject)的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)更新。 ——《設(shè)計(jì)模式》GoF 一個(gè)對(duì)象(目標(biāo)對(duì)象)的狀態(tài)發(fā)生改變,所有的依賴對(duì)象(觀察者對(duì)象)都將得到通知,進(jìn)行廣播通知。 運(yùn)行結(jié)果: 使

    2024年02月13日
    瀏覽(21)
  • 設(shè)計(jì)模式-觀察者

    設(shè)計(jì)模式-觀察者

    觀察者模式是一種廣泛應(yīng)用于軟件開(kāi)發(fā)中的行為設(shè)計(jì)模式,尤其是在面向?qū)ο缶幊蹋∣OP)中。該模式定義了對(duì)象之間的一對(duì)多依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都會(huì)得到通知并自動(dòng)更新 在觀察者模式中,存在兩個(gè)主要角色: 主題(Subject) 或 被

    2024年01月22日
    瀏覽(23)
  • 觀察者模式(Observer)

    觀察者模式(Observer)

    事件訂閱者者(Event-Subscriber) 監(jiān)聽(tīng)者(Listener) 觀察者 是一種行為設(shè)計(jì)模式, 允許你定義一種訂閱機(jī)制, 可在對(duì)象事件發(fā)生時(shí)通知多個(gè)“觀察”該對(duì)象的其他對(duì)象。 1. 問(wèn)題 假如你有兩種類型的對(duì)象 :“顧客”和“商店”。顧客對(duì)某個(gè)特定品牌的產(chǎn)品非常感興趣(例如最

    2024年02月12日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包