- 入口
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);
}
}