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

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

 

1、Spring中的事件发送与监听git

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

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

 

一、事件发送与监听的原理图函数

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

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

 

 

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

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

(1)、建立Eventblog

由于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。

  

 

 

2、@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

相关文章
相关标签/搜索