利用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自己实现观察者模式的更多相关文章

  1. 利用spring boot创建java app

    利用spring boot创建java app 背景 在使用spring框架开发的过程中,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置和复杂的bean依赖关系,特别是在使用mvc的时候各 ...

  2. 利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)

    主题:这份代码是开发中常见的代码,查询数据库某个主表的数据,为了提高性能,做一次缓存,每次调用时先拿缓存数据,有则直接返回,没有才向数据库查数据,降低数据库压力. public Merchant lo ...

  3. java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

    java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring   本文主要介绍利用JavaMailS ...

  4. 利用Spring.Net技术打造可切换的分布式缓存读写类

    利用Spring.Net技术打造可切换的Memcached分布式缓存读写类 Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具 ...

  5. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  6. spring事件驱动模型--观察者模式在spring中的应用

    spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用,关于观察者模式在之前的博文中总结过,http://www.cnblogs.com/fingerboy/p/5468994. ...

  7. 利用spring,实现package下的类扫描

    项目中需要用到包扫描的情况是很多的,一般是在项目初始化的时候,根据一些条件来对某个package下的类进行特殊处理.现在想实现的功能是,在一个filter或interceptor初始化的时候,扫描指定 ...

  8. 利用spring的MultipartFile实现文件上传【原】

    利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multi ...

  9. 利用Spring的junit4测试

    利用Spring的JUnit4进行测试 不需要再显式创建Spring容器和getBean @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigu ...

随机推荐

  1. javascript数字转汉字中文数字

    /* 工具包 */ var Utils={ /* 单位 */ units:'个十百千万@#%亿^&~', /* 字符 */ chars:'零一二三四五六七八九', /* 数字转中文 @numb ...

  2. Remove a Driver Package from the Driver Store

    http://technet.microsoft.com/en-us/library/cc730875.aspx Determine the name of the driver package in ...

  3. AVR JTAG MKii 引脚布局 ( JTAG 和 ISP )

    1,JTAG和ISP引脚复用,JTAG的TCK,TDO,TDI分别与ISP的SCK,MISO,MOSI复用:2,VT引脚必须接目标板电源,不然仿真器接口电路不工作: JTAG接口引脚定义如下 标配的J ...

  4. uva208 - Firetruck

    Firetruck The Center City fire department collaborates with the transportation department to maintai ...

  5. Remobjects SDK 服务器搭建

    for delphi: 在工程文件源码中,有一个编译字 {#ROGEN: ***.rodl},将它的名字改成 指定的 rodl 即可自动生成相关文件,一般默认为 NewService.

  6. ZTE AD3812 3G模块在linux 2.6.34 内核的开发板上的支持方法

    先说段废话,话说在linux 2.6.34 下,好多比较新的3G网卡及3G模块都没有很好的支持.如果想支持的这些3G网卡/3G模块呢,基本上有两种方式: 1.使用该3G模块的 linux 下的驱动,交 ...

  7. 转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现

    C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. ...

  8. mysql中自己定义函数编程

    语法: 新建: Create function function_name(參数列表)returns返回值类型 函数体 函数名,应该合法的标识符,而且不应该与已有的keyword冲突. 一个函数应该属 ...

  9. 两点C#的propertyGrid的使用心得

    最近接触C#的PropertyGrid比较多,得到了两个小心得记录一下. 第1点是关于控制PropertyGrid中属性的只读属性的. 我遇到的问题是这样的,我需要在运行时根据SVN的状态动态控制Pr ...

  10. javascript之处理Ajax错误

    使用Ajax须留心两类错误.它们的差别源于视角的不同. 第一类错误是从XMLHttpRequest对象的角度看到的问题:某些因素阻止了请求发送到server,比如DNS无法解析主机名,连接请求被拒绝. ...