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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java观察者模式在spring中的应用_利用spring自己实现观察者模式

發(fā)布時間:2025/3/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java观察者模式在spring中的应用_利用spring自己实现观察者模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

利用spring,自己實現(xiàn)的一個觀察者模式,寫著玩玩,目的是為了加深理解,下次用Spring自帶的玩一玩。

首先我們定義一個偵聽類接口

package com.hyenas.common.listener;

import java.util.Map;

public interface Observer {

public boolean isAsyn();

public void excute(Map params);

}

抽象偵聽類

package com.hyenas.common.listener;

public abstract class AbstractObserver implements Observer {

private boolean asyn = false;

public void setAsyn(boolean asyn) {

this.asyn = asyn;

}

@Override

public boolean isAsyn() {

return asyn;

}

}

事件管理類

package com.hyenas.common.listener;

import java.util.List;

import java.util.Map;

public class EventManager {

private Map> events;

public void setEvents(Map> events) {

this.events = events;

}

public void dispather(String eventName, Map params) {

if (events == null || events.isEmpty()) {

return;

}

List observers = events.get(eventName);

for (Observer observer : observers) {

if (observer.isAsyn()) {

EventManagerThead eventManagerThead = new EventManagerThead(

observer, params);

Thread t = new Thread(eventManagerThead);

t.start();

} else {

observer.excute(params);

}

}

}

class EventManagerThead implements Runnable {

private Observer observer;

private Map params;

public EventManagerThead(Observer observer, Map params) {

super();

this.observer = observer;

this.params = params;

}

@Override

public void run() {

observer.excute(params);

}

}

}

然后我們定義一個偵聽者的實現(xiàn)類

package com.hyenas.common.listener;

import java.util.Map;

import java.util.Map.Entry;

public class ObserverTest extends AbstractObserver {

@Override

public void excute(Map params) {

System.out.println("execute ObserverTest");

for (Entry entry : params.entrySet()) {

System.out.println(entry.getKey() + "->" + entry.getValue());

}

System.out.println("thread name ObserverTest:"

+ Thread.currentThread().getName());

}

}

Spring 配置文件??: listener.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

好了,我們來測試一下:

package com.hyenas.common.listener;

import java.util.HashMap;

import java.util.Map;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

public static void main(String[] args) {

ClassPathXmlApplicationContext ctx = null;

try {

String[] locations = { "listener.xml" };

ctx = new ClassPathXmlApplicationContext(locations);

EventManager eventManager = (EventManager) ctx

.getBean("eventManager");

System.out.println("thread name main:"

+ Thread.currentThread().getName());

Map map = new HashMap();

map.put("paramKey", "paramValue");

eventManager.dispather("observerTest", map);

} finally {

if (ctx != null) {

ctx.close();

}

}

}

}

運行結(jié)果:

thread name main:main

execute ObserverTest

paramKey->paramValue

thread name ObserverTest:Thread-0

里面的多線程操作可以換成線程池,spring 有一個類ThreadPoolTaskExecutor大家可以試一試

利用spring boot創(chuàng)建java app

利用spring boot創(chuàng)建java app 背景 在使用spring框架開發(fā)的過程中,隨著功能以及業(yè)務(wù)邏輯的日益復(fù)雜,應(yīng)用伴隨著大量的XML配置和復(fù)雜的bean依賴關(guān)系,特別是在使用mvc的時候各 ...

利用spring AOP 和注解實現(xiàn)方法中查cache-我們到底能走多遠(yuǎn)系列(46)

主題:這份代碼是開發(fā)中常見的代碼,查詢數(shù)據(jù)庫某個主表的數(shù)據(jù),為了提高性能,做一次緩存,每次調(diào)用時先拿緩存數(shù)據(jù),有則直接返回,沒有才向數(shù)據(jù)庫查數(shù)據(jù),降低數(shù)據(jù)庫壓力. public Merchant lo ...

java 利用spring JavaMailSenderImpl發(fā)送郵件,支持普通文本、附件、html、velocity模板

java 利用spring JavaMailSenderImpl發(fā)送郵件,支持普通文本.附件.html.velocity模板 博客分類: Java Spring ? 本文主要介紹利用JavaMailS ...

利用Spring.Net技術(shù)打造可切換的分布式緩存讀寫類

利用Spring.Net技術(shù)打造可切換的Memcached分布式緩存讀寫類 Memcached是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),因為工作在內(nèi)存,讀寫速率比數(shù)據(jù)庫高的不是一般的多,和Radis一樣具 ...

利用Spring AOP自定義注解解決日志和簽名校驗

轉(zhuǎn)載:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解決的問題 部分API有簽名參數(shù)(signature),Passport首先 ...

spring事件驅(qū)動模型--觀察者模式在spring中的應(yīng)用

spring中的事件驅(qū)動模型也叫作發(fā)布訂閱模式,是觀察者模式的一個典型的應(yīng)用,關(guān)于觀察者模式在之前的博文中總結(jié)過,http://www.cnblogs.com/fingerboy/p/5468994. ...

利用spring,實現(xiàn)package下的類掃描

項目中需要用到包掃描的情況是很多的,一般是在項目初始化的時候,根據(jù)一些條件來對某個package下的類進(jìn)行特殊處理.現(xiàn)在想實現(xiàn)的功能是,在一個filter或interceptor初始化的時候,掃描指定 ...

利用spring的MultipartFile實現(xiàn)文件上傳【原】

利用spring的MultipartFile實現(xiàn)文件上傳 主要依賴jar包 spring-web-3.0.6.RELEASE.jar 用到?(org.springframework.web.multi ...

利用Spring的junit4測試

利用Spring的JUnit4進(jìn)行測試 不需要再顯式創(chuàng)建Spring容器和getBean @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigu ...

隨機(jī)推薦

在spring boot環(huán)境中使用fastjson + redis的高速緩存技術(shù)

因為項目需求,需要在spring boot環(huán)境中使用redis作數(shù)據(jù)緩存.之前的解決方案是參考的http://wiselyman.iteye.com/blog/2184884,具體使用的是Jackso ...

Vue2.0 --- vue-cli腳手架中全局引入JQ

第一步:安裝jQuery npm/cmpn方式安裝(默認(rèn)安裝1.7.X版本的JQ) npm/cnpm install jQuery 如果想安裝更高版本的JQ那么可以選擇在package.json文件下 ...

Constructing Roads-最小生成樹(kruskal)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 題目描述: #include #include

JQuery 限制文本輸入只能輸入數(shù)字(可自定義正則表達(dá)式)

var JVerify = { role: { number: /[0-9\/]/, decimal: /[0-9\.\/]/, code: /[0-9A-Z]/ }, Verify: functio ...

MYSQL 1093 之You can't specify target table for update in FROM clause解決辦法

You can't specify target table for update in FROM clause含義:不能在同一表中查詢的數(shù)據(jù)作為同一表的更新數(shù)據(jù). 出現(xiàn)以上錯誤,是因為想將表自身的字 ...

ASP.NET SingalR + MongoDB 實現(xiàn)簡單聊天室(二):實現(xiàn)用戶信息、聊天室初始化,聊天信息展示完善

第一篇已經(jīng)介紹了一大半了,下面就是詳細(xì)業(yè)務(wù)了,其實業(yè)務(wù)部分要注意的地方有幾個,剩下的就是js跟html互動處理. 首先在強(qiáng)調(diào)一下,頁面上不可缺少的js:jquery,singalR.js,hubs . ...

[BZOJ4836]二元運算(分治FFT)

4836: [Lydsy1704月賽]二元運算 Time Limit: 8 Sec??Memory Limit: 128 MBSubmit: 578??Solved: 202[Submit][Stat ...

轉(zhuǎn):django中session的實現(xiàn)機(jī)制

轉(zhuǎn):www.jianshu.com 要理解session,首先要搞清楚cookie的概念.由于http是無狀態(tài)的,服務(wù)器不能記住用戶的信息狀態(tài),因此若由同一個客戶端發(fā)起的多條請求,服務(wù)器不能辨別這些請 ...

redis操作幫助類

RedisHelper.java import redis.clients.jedis.*; import java.util.*; public class RedisHelper { privat ...

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的java观察者模式在spring中的应用_利用spring自己实现观察者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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