1.简要说明
Spring的事件( Application Event) 为Bean与Bean之间的消息通信提供了支持。当一个
Bean处理完一个任务之后,希望另外一个Bean知道并能做相应的处理,这时我们就需要让另
外一个Bean监听当前Bean所发送的事件。
Spring的事件需要遵循如下流程:
(1)自定义事件,集成ApplicationEvent.
(2)定义事件监听器,实现ApplicationListener.
(3)使用容器发布事件。
2. 自定义事件
package com.lglg.springdemo01;
import org.springframework.context.ApplicationEvent;
/**
* Date:2020/8/15
* 自定义事件
* @author:lg
*/
public class DemoEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private String msg;
public DemoEvent(Object source,String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3.自定义事件监听器
package com.lglg.springdemo01;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
* Date:2020/8/15
* 事件监听器
* @author:lg
*/
@Component
public class DemoListener implements ApplicationListener<DemoEvent>{
/**
* ①实现ApplicationListener接口,
并指定监听的事件类型。
②使用onApplicationEvent方法对消息进行接受处理。
* @param demoEvent
*/
@Override
public void onApplicationEvent(DemoEvent demoEvent) {
String msg = demoEvent.getMsg();
System.out.println("我(bean-demolistener) 接收到了bean-dePublisher发布的消息:" + msg);
}
}
4.编写事件发布类
package com.lglg.springdemo01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
/**
* Date:2020/8/15
*
* @author:lg
*/
@Component
public class DemoPublisher {
/**
* ①注入ApplicationContext用来发布事件。
* ②使用ApplicationContext的publishEvent 方法来发布。
*/
@Autowired
private ApplicationContext applicationContext;
public void publish(String msg){
applicationContext.publishEvent(new DemoEvent(this,msg));
}
}
5.编写配置类
package com.lglg.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* Date:2020/8/9
*
* @author:lg
*/
@Configuration
@ComponentScan("com.lglg")// 扫面相应的包路径
//@EnableAspectJAutoProxy // 注解开启Spring对AspectJ代理的支持
public class EventConfig {
// @Bean// 通过该注解将该方法上的bean注入到Spring容器中
// public FunctionService functionService(){
// return new FunctionService();
// }
//
// @Bean
// public UserFunctionService userFunctionService(){
// return new UserFunctionService();
// }
}
6.编写测试类
package com.lglg.demoTest;
import com.lglg.config.EventConfig;
import com.lglg.springdemo01.DemoPublisher;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* Date:2020/8/15
*
* @author:lg
*/
public class Demo07 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(EventConfig.class);
DemoPublisher bean = context.getBean(DemoPublisher.class);
bean.publish("i am lg");
context.close();
}
}
7.运行效果
我(bean-demolistener) 接收到了bean-dePublisher发布的消息:i am lg