java观察者模式在spring中的应用_利用spring自己实现观察者模式
利用spring,自己實現的一個觀察者模式,寫著玩玩,目的是為了加深理解,下次用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);
}
}
}
然后我們定義一個偵聽者的實現類
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();
}
}
}
}
運行結果:
thread name main:main
execute ObserverTest
paramKey->paramValue
thread name ObserverTest:Thread-0
里面的多線程操作可以換成線程池,spring 有一個類ThreadPoolTaskExecutor大家可以試一試
利用spring boot創建java app
利用spring boot創建java app 背景 在使用spring框架開發的過程中,隨著功能以及業務邏輯的日益復雜,應用伴隨著大量的XML配置和復雜的bean依賴關系,特別是在使用mvc的時候各 ...
利用spring AOP 和注解實現方法中查cache-我們到底能走多遠系列(46)
主題:這份代碼是開發中常見的代碼,查詢數據庫某個主表的數據,為了提高性能,做一次緩存,每次調用時先拿緩存數據,有則直接返回,沒有才向數據庫查數據,降低數據庫壓力. public Merchant lo ...
java 利用spring JavaMailSenderImpl發送郵件,支持普通文本、附件、html、velocity模板
java 利用spring JavaMailSenderImpl發送郵件,支持普通文本.附件.html.velocity模板 博客分類: Java Spring ? 本文主要介紹利用JavaMailS ...
利用Spring.Net技術打造可切換的分布式緩存讀寫類
利用Spring.Net技術打造可切換的Memcached分布式緩存讀寫類 Memcached是一個高性能的分布式內存對象緩存系統,因為工作在內存,讀寫速率比數據庫高的不是一般的多,和Radis一樣具 ...
利用Spring AOP自定義注解解決日志和簽名校驗
轉載:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解決的問題 部分API有簽名參數(signature),Passport首先 ...
spring事件驅動模型--觀察者模式在spring中的應用
spring中的事件驅動模型也叫作發布訂閱模式,是觀察者模式的一個典型的應用,關于觀察者模式在之前的博文中總結過,http://www.cnblogs.com/fingerboy/p/5468994. ...
利用spring,實現package下的類掃描
項目中需要用到包掃描的情況是很多的,一般是在項目初始化的時候,根據一些條件來對某個package下的類進行特殊處理.現在想實現的功能是,在一個filter或interceptor初始化的時候,掃描指定 ...
利用spring的MultipartFile實現文件上傳【原】
利用spring的MultipartFile實現文件上傳 主要依賴jar包 spring-web-3.0.6.RELEASE.jar 用到?(org.springframework.web.multi ...
利用Spring的junit4測試
利用Spring的JUnit4進行測試 不需要再顯式創建Spring容器和getBean @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigu ...
隨機推薦
在spring boot環境中使用fastjson + redis的高速緩存技術
因為項目需求,需要在spring boot環境中使用redis作數據緩存.之前的解決方案是參考的http://wiselyman.iteye.com/blog/2184884,具體使用的是Jackso ...
Vue2.0 --- vue-cli腳手架中全局引入JQ
第一步:安裝jQuery npm/cmpn方式安裝(默認安裝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 限制文本輸入只能輸入數字(可自定義正則表達式)
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含義:不能在同一表中查詢的數據作為同一表的更新數據. 出現以上錯誤,是因為想將表自身的字 ...
ASP.NET SingalR + MongoDB 實現簡單聊天室(二):實現用戶信息、聊天室初始化,聊天信息展示完善
第一篇已經介紹了一大半了,下面就是詳細業務了,其實業務部分要注意的地方有幾個,剩下的就是js跟html互動處理. 首先在強調一下,頁面上不可缺少的js:jquery,singalR.js,hubs . ...
[BZOJ4836]二元運算(分治FFT)
4836: [Lydsy1704月賽]二元運算 Time Limit: 8 Sec??Memory Limit: 128 MBSubmit: 578??Solved: 202[Submit][Stat ...
轉:django中session的實現機制
轉:www.jianshu.com 要理解session,首先要搞清楚cookie的概念.由于http是無狀態的,服務器不能記住用戶的信息狀態,因此若由同一個客戶端發起的多條請求,服務器不能辨別這些請 ...
redis操作幫助類
RedisHelper.java import redis.clients.jedis.*; import java.util.*; public class RedisHelper { privat ...
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java观察者模式在spring中的应用_利用spring自己实现观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 图片层级_Java Colle
- 下一篇: java jsp filename fi