Hello,大家好,前面几篇Spring的文章把Spring容器这一块大致分享完了,容器的创建,容器里的Bean,后面一篇文章会好好的讲一讲AOP,这一篇来点小菜吃吃,讲个Spring的容器事件,这个知识不是很常用。为什么呢? 因为一般稍微大型一点的系统都是分布式的,不会采用局部项目中的通讯,要通讯也是采用MQ ,但既然写了Spring系列的博客,还是和大家分享分享。OK,老讨论,文章结构:
谈到事件,其实很多框架组件都自带事件机制,宏观上讲,JDK里的notify其实也算是事件,能够通知wait的线程。这里给大家来一张图,然后直接切入主题的讲Spring里的内置事件:
好了,其实非常简单,然后给一下Spring内部的Spring事件继承图:
Spring内部所有的事件都是继承自ApplicationEvent,内置的事件有ContextClosedEvent,ContextRefreshEvent,ContextStartedEvent,ContextStoppedEvent和ServletRequestHandledEvent.分别表示容器启动,关闭,刷新,中止的事件和一次请求服务完成的事件。
然后给一个例子演示内置事件:
public class ContextStopListener implements ApplicationListener<ContextStoppedEvent>{ public void onApplicationEvent(ContextStoppedEvent event) { System.out.println("ContextStoppedEvent Received"); } }
直接把这个类注入到Spring中成为Bean即可。容器关闭时,就会调用onApplicationEvent...
上面可以看到,内置的事件,我们只需要自定义一个Listener放入Spring容器即可。那么要是自定义的事件呢,来看一个例子:
public class ZdyEvent extends ApplicationEvent { private String whatsHasspend; public ZdyEvent(Object source,String whatsHasspend) { super(source); this.whatsHasspend=whatsHasspend; } public String getWhatsHasspend() { return whatsHasspend; } public void setWhatsHasspend(String whatsHasspend) { this.whatsHasspend = whatsHasspend; } } public class ZdyListener implements ApplicationListener<ZdyEvent> { @Override public void onApplicationEvent(ZdyEvent zdyEvent) { System.out.println("事件接收器接收到了Event:"+zdyEvent.getWhatsHasspend()); } }
然后我们的Main:
public static void main( String[] args ) { ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml"); ZdyEvent event =new ZdyEvent(ac,"我发送了一个事件:我吃了一个苹果.."); ac.publishEvent(event); }
打印:
事件接收器接收到了Event:我发送了一个事件:我吃了一个苹果..
好了,其实前面已经提到过,Spring的事件机制厉害是厉害,但只停留的当前工程的Spring模块中,首先不适合集群,其次不适合分布式。所以,说白了,是个花架子。大家仅供了解。无论是集群还是分布式的通讯,肯定是不会用这个东东,一般都是Mq,zk,kafka这类分布式组件,做过系统架构的应该比较清楚。本文也是顺带的提了提,大致说了说。 Over,Have a good day .