利用spring自己实现观察者模式
利用spring,自己实现的一个观察者模式,写着玩玩,目的是为了加深理解,下次用Spring自带的玩一玩。
首先我们定义一个侦听类接口
package com.hyenas.common.listener;
import java.util.Map;
public interface Observer {
public boolean isAsyn();
public void excute(Map<String, Object> 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<String, List<Observer>> events; public void setEvents(Map<String, List<Observer>> events) {
this.events = events;
} public void dispather(String eventName, Map<String, Object> params) {
if (events == null || events.isEmpty()) {
return;
} List<Observer> 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<String, Object> params; public EventManagerThead(Observer observer, Map<String, Object> 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<String, Object> params) { System.out.println("execute ObserverTest"); for (Entry<String, Object> entry : params.entrySet()) {
System.out.println(entry.getKey() + "->" + entry.getValue());
} System.out.println("thread name ObserverTest:"
+ Thread.currentThread().getName());
} }
Spring 配置文件 : listener.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"> <bean id="eventManager" class="com.hyenas.common.listener.EventManager">
<property name="events">
<map>
<entry key="observerTest">
<list>
<ref bean="observerTest"/>
</list>
</entry>
</map>
</property>
</bean> <bean id="observerTest" class="com.hyenas.common.listener.ObserverTest">
<property name="asyn" value="true"></property>
</bean> </beans>
好了,我们来测试一下:
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<String, Object> map = new HashMap<String, Object>();
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自己实现观察者模式的更多相关文章
- 利用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 ...
随机推荐
- Linux 批量添加用户
#!/bin/bashfor i in $(seq 1 50) #会建立1-50的用户douseradd student$i -g studentecho student$i |passwd ...
- Sending messages to non-windowed applications -- AllocateHWnd, DeallocateHWnd
http://delphi.about.com/od/windowsshellapi/l/aa093003a.htm Page 1: How Delphi dispatches messages in ...
- counting sort 计数排序
//counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...
- Swift学习资源
原文: http://leancodingnow.com/swift-learning-resources/ Swift是Apple在今年的WWDC推出的一门新的编程语言,它的1.0版本跟着Xcode ...
- 不要滥用div,保持代码的整洁
这篇文章算是很基础的了.旨在介绍如何保证页面代码的整洁.以维护性.使用有语义的页面标签,减少标签的滥用. 1. 移除不必要的<div>标签 嵌套在<form><ul> ...
- Android调用相机并将照片存储到sd卡上
Android中实现拍照有两种方法,一种是调用系统自带的相机,然后使用其返回的照片数据. 还有一种是自己用Camera类和其他相关类实现相机功能,这种方法定制度比较高,洗染也比较复杂,一般平常的应用只 ...
- os.getcwd()
1.os.getcwd():获取当前工作目录,也就是在哪个目录下运行这个程序.举例来说:假设F:\aaa\bbb\ccc目录下有个文件 TestDir.py,打印当前工作目录.进入windows命令行 ...
- (hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)
题目: ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- ntoskrnl.exe损坏或丢失的解决方式
同事的电脑启动时出现下面提示:"因下面文件损坏或丢失Windows无法启动 %systemroot%\system32\ntoskrnl.exe,请又一次安装以上文件的拷贝"(Wi ...
- JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...