Java中监听器 和Spring监听器简单实现和实现原理

Java中的事件监听使用

Java中的事件监听机制主要由事件源、事件对象、事件监听器三个部分组成。

DoorEvent:事件对象(event object)


public class DoorEvent extends EventObject
{
	private String doorState = "";	// 表示门的状态,有“开”和“关”两种
	public DoorEvent(Object source)
	{
		super(source);
	}
	
	public void setDoorState(String doorState)
	{
		this.doorState = doorState;
	}
	
	public String getDoorState()
	{
		return this.doorState;
	}
}
 


IDoorListener:事件监听器(event listener)

public interface IDoorListener extends EventListener
{
    //EventListener是所有事件侦听器接口必须扩展的标记接口、因为它是无内容的标记接口、     
    //所以事件处理方法由我们自己声明如下:
    public void dealDoorEvent(DoorEvent event);
}

FrontDoorListener:事件监听器(event listener)

public class FrontDoorListener implements IDoorListener
{
    /**
     * 做具体的开门,关门动作
     * @param event 
     */
    @Override
    public void dealDoorEvent(DoorEvent event)
    {
        if (event.getDoorState()!=null && event.getDoorState().equals("open"))
        {
            System.out.println("前门打开");
        }
        else
        {
            System.out.println("前门关闭");
        }
    }    
}

DoorManager:事件源(event source)

public class DoorManager
{
    private List<IDoorListener> listeners = new ArrayList();
    
    public void addDoorListener(IDoorListener listener)
    {
        synchronized (this)
        {
            if (listener != null && !(listeners.contains(listener)))
            {
                listeners.add(listener);
            }
        }
    }
    
    public void removeDoorListener(IDoorListener listener)
    {
        synchronized (this)
        {
            if (listeners.contains(listener))
            {
                listeners.remove(listener);
            }
        }
    }
    
    public void notifyDoors(DoorEvent event)
    {
        for (IDoorListener iDoorListener : listeners)
        {
            iDoorListener.dealDoorEvent(event);
        }
    }
    
    /**
     * 模拟开门事件
     */
    public void fireOpend()
    {
        if (listeners == null)
        {
            return;
        }
        DoorEvent event = new DoorEvent(this);
        event.setDoorState("open");
        
        notifyDoors(event);
    }
}

测试类:

public class TestMain
{
    public static void main(String[] args)
    {
        DoorManager doorManager = new DoorManager();
        // 添加监听器
        doorManager.addDoorListener(new FrontDoorListener());
        doorManager.addDoorListener(new IDoorListener()
        {
            @Override
            public void dealDoorEvent(DoorEvent event)
            {
                if (event.getDoorState() != null && event.getDoorState().equals("open"))
                {
                    System.out.println("后门打开,警示灯亮起");
                }
                else
                {
                    System.out.println("后门关闭,警示灯熄灭");
                }
            }
        });
        
        // 模拟事件
        System.out.println("模拟门打开事件");
        doorManager.fireOpend();
        
        System.out.println("模拟门关闭事件");
        DoorEvent doorEvent = new DoorEvent(doorManager);
        doorEvent.setDoorState("close");
        doorManager.notifyDoors(doorEvent);
    }
}

spring中监听器使用

先看使用spring来实现一个简单监听实用的例子:

MailSendEvent.Java

import org.springframework.context.ApplicationContext;  
import org.springframework.context.event.ApplicationContextEvent;  
  
public class MailSendEvent extends ApplicationContextEvent {  
    private String to;  
      
    public MailSendEvent(ApplicationContext source, String to) {  
        super(source);  
        this.to = to;  
    }  
    public String getTo() {  
          
        return this.to;  
    }  
}  

MailSendListener.java

import org.springframework.context.ApplicationListener;  
  
public class MailSendListener implements ApplicationListener<MailSendEvent>{  
  
    public void onApplicationEvent(MailSendEvent event) {  
            MailSendEvent mse = (MailSendEvent) event;  
            System.out.println("MailSendListener:向" + mse.getTo() + "发送完一封邮件");  
    }  
}  

MailSender.java

public class MailSender implements ApplicationContextAware {  
  
    private ApplicationContext ctx ;  
  
    public void setApplicationContext(ApplicationContext ctx)  
            throws BeansException {  
        this.ctx = ctx;  
  
    }     
    public void sendMail(String to){  
        System.out.println("MailSender:模拟发送邮件...");  
        MailSendEvent mse = new MailSendEvent(this.ctx,to);  
        ctx.publishEvent(mse);  
    }  
}  

spring-context.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"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
     <bean class="com.baobaotao.event.MailSendListener"/>  
     <bean id="mailSender" class="com.baobaotao.event.MailSender"/>  
</beans>  

ApplicationEventTest.java

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
  
public class ApplicatonEventTest {  
  
    public static void main(String[] args) {  
        String resourceFile = "com/baobaotao/event/beans.xml";  
        ApplicationContext ctx = new ClassPathXmlApplicationContext(resourceFile);    
        MailSender mailSender = ctx.getBean(MailSender.class);  
        mailSender.sendMail("test mail.");  
        System.out.println("done.");  
    }  
}  

实现原理:

待补充...

参考资料:

Spring学习历程--- 一个监听器实例

Spring 中的事件监听的实现

 

转载于:https://my.oschina.net/u/1266221/blog/889944

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值