前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换

JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换

作者头像
lizelu
发布2018-01-11 11:10:09
8910
发布2018-01-11 11:10:09
举报
文章被收录于专栏:青玉伏案青玉伏案

本篇博客我们就来聊一下Spring框架中的观察者模式的应用,即事件的发送与监听机制。之前我们已经剖析过观察者模式的具体实现,以及使用Swift3.0自定义过通知机制。所以本篇博客对于事件发送与监听的底层实现就不做过多赘述了。下方会给出Spring中是如何进行事件的发送与监听的。聊完事件的发送与监听,我们再来聊一下如何使用@Profile注解来切换“生产环境”与“开发环境”。

一、Spring中的事件发送与监听

Spring中的事件发送与监听说白了就是广播。由Publisher来发送Event,有Listener来接收Event。Publisher和Listenter是一对多的关系,当Publisher在发送Event时,并不确定是哪些Listener会收到该发布的事件。当然再进一步说,Spring的事件发送与监听的本质还是观察者模式的具体实现。之前的博客我们拿Swift语言来具体的实现和分析了观察者模式,关于观察者模式的具体内容,请移步于《自己动手使用“观察者模式”实现通知机制》。

该部分关于“观察者模式”的东西就不做过多赘述了,主要就来看一下在Spring中是如何使用事件发送以及事件监听的。

1、事件发送与监听的原理图

一直看代码比较枯燥,那么我们就来一张原理图来看一下Spring框架中的事件发布者(Publisher)、事件(Event)、监听者(Listener)之间的关系。上面也提到了,Publisher与Listener之间的关系是一对多的关系。也就是说Publisher发布Event是通过广播的形式来实现的。Publisher在发送Event时,并不确定是那些Listener接收的Event。

而Event就是发送消息的载体。也就是说Publisher与Listener之间交流的载体就是Event对象。Publisher发布Event对象,而Listener则接收Event对象。三者之间的关系具体如下所示:

2、事件发送与监听的具体实现

搞明白上述原理,在给出具体实现就简单多了。接下来我们就来看看Spring中是如何来实现上述关系的。

(1)、创建Event

因为Event是广播信息的载体,类似于iOS开发中的NSNotification。所以我们就先创建Spring框架中的Event。下方的DemoEvent就是我们创建的事件,当然该事件要继承ApplicationEvent类。DemoEvent类中的msg属性就用来承载该事件的信息。而serialVersionUID则表示该事件的标示。具体如下所示:

(2)、创建Publisher

创建完事件后,接下来我们就来创建事件的发布者。下方的DemoPublisher就是我们创建的发布事件的类。在类中我们使用@Autowired注解了ApplicationContext类的注入点。因为我们要使用ApplicationContext对象的publicEvent()方法来进行推送,而publicEvent()方法的参数就是我们上面创建DemoEvent事件的对象。如下所示。

(3)、创建Listener

Event以及Publisher创建完毕后,接下来我们就来创建接收事件的Listener。我们可以创建多个Listener来接收Publisher发布的Event,下方就我们就以DemoListener为例。DemoListener类实现了ApplicationListener接口,并且给出了onApplicationEvent()方法的实现。当收到Publisher发布的Event时,就会执行下方的onApplicationEvent()方法,而该方法的参数就是我们创建的DemoEvent事件对象。

由下方截图不难看出,此处我们创建了两个Listener,当上面的Publisher发布完事件后,这两个Listener都会收到相应的事件消息。

(4)、运行并输出结果

Event、Publisher、Listener创建完毕后,接下来我们就该测试这三者了。因为我们所创建的Publisher是Spring管理的Bean(@Component),所以从Spring的容器中获取Publisher的对象,然后调用public()方法进行事件的发布。

下方就是我们测试用的Main方法,然后是消息的输出。可见,我们的这个事件的两个监听者都收到了来着Publisher的Even。

二、@Profile注解

在Spring框架中,我们可以使用@Profile注解来设置相应的开发环境,如生产环境、准生产环境或者测试环境等。接下来我们就来看一下@Profile注解的使用方式。当然@Profile注解是在Java配置类中声明Bean时使用的,下方会给出具体实现。

首先我们创建一个测试Bean,我们将该Bean命名为DemoProfileBean。稍后,我们将会在Java的配置文件中对该类进行Bean的声明。下方代码段比较简单,在此就不做过多赘述了。

然后我们就要来实现我们的Java配置类了。下方的ProfileConfig就是该部分创建的Java配置文件,在其中我们声明了两个Bean。这两个Bean都是DemoProfileBean类的Bean的声明。不过创建对象时所提供的参数不同。我们使用@Profile来进行区分,如果@Profile的参数是“develop”,那么我们就将DemoProfileBean对象的参数设置成开发环境的IP地址,如果@Profile的参数是“product”的话,那么所创建的DemoProfileBean的对象的参数就是生产环境的IP地址,具体代码如下所示。

创建好上述配置文件后,接下来我们就该创建测试用的Main函数了。下方就是Main函数的具体内容,下方紧接着是运行效果。可以看出,我们指定的Profile的值不同,所创建的对象的参数也是不同的。具体如所示:

今天博客就先到这儿吧,github源码分享地址:https://github.com/lizelu/SpringDemo

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-04-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档