zoukankan      html  css  js  c++  java
  • JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换

    本篇博客我们就来聊一下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对象。三者之间的关系具体如下所示:

    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

  • 相关阅读:
    【C语言入门教程】2.3 整型数据
    【C语言入门教程】2.1 数据类型(5种基本数据类型),聚合类型与修饰符
    【C语言入门教程】2.2 常量 与 变量
    【C语言入门教程】1.3 C语言“32个”关键字
    【C语言入门教程】1.2 函数库 和 链接
    【C语言入门教程】1.1 基本程序结构
    【C语言入门教程】目录/大纲
    【C语言】 Linux下编译提示pow未定义引用
    Linux C 收藏
    Ubuntu 14 常用“快捷键”,Ctrl + Alt + F1 进入终端,按 Ctrl + Alt + F7 回到界面
  • 原文地址:https://www.cnblogs.com/ludashi/p/6549972.html
Copyright © 2011-2022 走看看