Spring---ApplicationContext的事件机制
事件源:ApplicationContext。publishEvent()方法:用于主动触发容器事件。
事件:ApplicationEvent类,容器事件,必须由ApplicationContext发布。
事件监听器:ApplicationListener接口,可由容器中任何监听器Bean担任。onApplicationEvent(ApplicationEvent event):每当容器内发生任何事件时,此方法都被触发
容器事件类需继承ApplicationEvent类,容器事件的监听器类需实现ApplicationListener接口。
下面给出一个例子
1.首先定义一个EmailEvent类,继承ApplicationEvent类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class EmailEvent extends ApplicationEvent { private String address; private String text; public EmailEvent(Object source) { super(source); } public EmailEvent(Object source, String address, String text) { super(source); this .address = address; this .text = text; } public String getAddress() { return address; } public void setAddress(String address) { this .address = address; } public String getText() { return text; } public void setText(String text) { this .text = text; } } |
2,定义一个EmailNotifier类,实现ApplicationListener接口,并复写onApplicationEvent()方法
1 2 3 4 5 6 7 8 9 10 11 12 | public class EmailNotifier implements ApplicationListener { @Override public void onApplicationEvent(ApplicationEvent applicationEvent) { if (applicationEvent instanceof EmailEvent){ EmailEvent emailEvent = (EmailEvent) applicationEvent; System. out .println( "需要发送邮件的接收地址: " + emailEvent.getAddress()); System. out .println( "需要发送邮件的邮件正文: " + emailEvent.getText()); } else { System. out .println( "容器本身的事件: " + applicationEvent); } } } |
3.将监听器配置在容器中
1 | <bean class = "org.spring.listener.EmailNotifier" /> |
4.编写主程序main
1 2 3 4 5 6 7 | public class SpringTest { public static void main(String[] args){ ApplicationContext ctx = new ClassPathXmlApplicationContext( "spring-config.xml" ); // EmailEvent ele = new EmailEvent("hello","spring_test@163.com","this is a test"); // ctx.publishEvent(ele); } } |
程序到此结束,运行结果如下:
1 | 容器本身的事件: org.springframework.context. event .ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@b81eda8: startup date [Thu Dec 04 20:20:52 CST 2014]; root of context hierarchy] |
若取消main中的注释,即,使用publishEvent()来触发事件,运行结果如下:
1 2 3 | 容器本身的事件: org.springframework.context. event .ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@b81eda8: startup date [Thu Dec 04 20:24:03 CST 2014]; root of context hierarchy] 需要发送邮件的接收地址: spring_test@163.com 需要发送邮件的邮件正文: this is a test |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步