Spring源码拜读之Spring的事件驱动

  1. 入口 
ContextLoaderListener 底层使用java.util.EventListener (Java中的事件机制,也就是观察者模式)

java中的事件机制的参与者有3种角色:

1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中

2.event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener。(被观察者)

3.event listener:对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。(观察者)

ApplicationEvent

/**
 * @author lichenyang8
 * @date 2019/6/17
 */
public class MyEvent extends ApplicationEvent {
    /**
     * Create a new ApplicationEvent.
     *
     * @param source the object on which the event initially occurred (never {@code null})
     */
    public MyEvent(Object source) {
        super(source);
    }
}

ApplicationListener

package com.jd.ept.open.man.event;

import org.springframework.context.ApplicationListener;

/**
 * @author lichenyang8
 * @date 2019/6/17
 */
public class MyListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent event) {
        int s= 1/0;
        System.out.println("listener my event,content: " + event.getSource());
    }

}

ErrorHandler(异常回调的实现)

package com.jd.ept.open.man.event;

import org.springframework.util.ErrorHandler;

/**
 * @author lichenyang8
 * @date 2019/6/17
 */
public class MyErrorHandler implements ErrorHandler {
    @Override
    public void handleError(Throwable t) {
        System.out.println(t.getClass());
        System.out.println(t.getMessage());
    }
}

spring-context.xml

    <bean class="com.jd.ept.open.man.event.MyListener"/>

    <!-- 定义一个固定大小的线程,采用factory-method和静态方法的形式,参数注入使用构造函数注入 -->
    <bean name="executor" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool">
        <constructor-arg index="0">
            <value>5</value>
        </constructor-arg>
    </bean>
    <!-- 定义applicationEventMulticaster,注入线程池和errorHandler,此处使用系统自带的广播器,也可以注入其他广播器, -->
    <bean name="applicationEventMulticaster"
          class="org.springframework.context.event.SimpleApplicationEventMulticaster">
        <property name="taskExecutor" ref="executor"></property>
        <property name="errorHandler" ref="errorHandler"></property>
    </bean>
    <!-- 定义一个errorHandler,统一处理异常信息 -->
    <bean name="errorHandler" class="com.jd.ept.open.man.event.MyErrorHandler"></bean>

    <bean id="sysConfigServiceImpl" class="com.jd.ept.open.man.service.impl.SysConfigServiceImpl"/>

main

package com.jd.ept.open.man.event;

import com.jd.ept.open.man.service.impl.SysConfigServiceImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author lichenyang8
 * @date 2019/6/17
 */
public class TestMain {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        context.publishEvent(new MyEvent("init"));
        SysConfigServiceImpl sysConfigServiceImpl = (SysConfigServiceImpl) context.getBean("sysConfigServiceImpl");
        System.out.println(sysConfigServiceImpl);
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值