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

 

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

Spring中的事件发送与监听说白了就是广播。由Publisher来发送Event,有Listener来接收EventPublisher和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对象。三者之间的关系具体如下所示:

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

 

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

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

(1)、创建Event

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

(2)、创建Publisher

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

(3)、创建Listener

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

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

(4)、运行并输出结果

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

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

 

二、@Profile注解

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

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

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

  万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

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

作者:青玉伏案 
出处:http://www.cnblogs.com/ludashi/ 
本文版权归作者和共博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
如果文中有什么错误,欢迎指出。以免更多的人被误导。

http://www.cnblogs.com/ludashi/p/6549972.html