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 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值