利用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. 结构类模式(四):装饰(Decorator)

    定义 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点 装饰对象和真实对象有相同的接口.这样客户端对象就能以 ...

  2. ANSI_NULLS 和 QUOTED_IDENTIFIER

    1  ANSI_NULLS 当 SET ANSI_NULLS 为 ON 时,对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE    例如:SELECT * from t ...

  3. android ExpandAbleListView控件

    ExpandAbleListView控件 1.API对ExpandAbleListView的解释:

  4. props 和 state的区别

    作者:孙志勇 微博 日期:2016年11月29日 一.时效性 所有信息都具有时效性.文章的价值,往往跟时间有很大关联.特别是技术类文章,请注意本文创建时间,如果本文过于久远,请读者酌情考量,莫要浪费时 ...

  5. C#获取程序集的版本号和最后编译时间

    C#获取程序集的版本号:string ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToStrin ...

  6. C++头文件中预编译宏的目的

    C++头文件中预编译宏的目的 eg: #ifndef _FACTORY_H_#define _FACTORY_H_......#endif //~_FACTORY_H_ 防止头文件被重复包含,导致变量 ...

  7. Fox Roddick interviw Federer before 2013 US Open

    talk about  Mike Jordan , talk about Tiger Woods, their competitor when people discuss you I love wi ...

  8. windows7添�windows2008R2域配置

    server端配置: windows2008R2 WIN+R -> dcmopro -> 下一步 -> .... client配置: windows7 配置 DNS,如图: 计算机 ...

  9. iOS开发——UI篇Swift篇&UISlider

    UISlider override func viewDidLoad() { super.viewDidLoad() titleLabel.text = titleString // Do any a ...

  10. UIStoryboard

    UIStoryboard 目录 概述 Storyboard的创建 Storyboard中的页面跳转 文件内跳转 文件外跳转 Segues 不同类型的视图控制器在UIStoryboard上的实现 概述 ...