JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换
本篇博客我们就来聊一下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
JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换的更多相关文章
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
上篇博客我们聊了<JavaEE开发之Spring中的依赖注入以及AOP>,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下 ...
- JavaEE开发之Spring中的条件注解组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- JavaEE开发之Spring中的条件注解、组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- spring中的事件发布与监听
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. spring事件发布与监听的应用场景 当处理完一段代码逻辑,接下来需要同 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术
在上篇博客中,我们聊了<JavaEE开发之SpringMVC中的自定义拦截器及异常处理>.本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置 ...
- JavaEE开发之SpringMVC中的自定义拦截器及异常处理
上篇博客我们聊了<JavaEE开发之SpringMVC中的路由配置及参数传递详解>,本篇博客我们就聊一下自定义拦截器的实现.以及使用ModelAndView对象将Controller的值加 ...
随机推荐
- 微信公众号开发总结(Node.js + express + winston)
关于订阅号.服务号.企业号 官方定位 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式. 服务号:主要偏于服务交互(类似银 ...
- use vue vuex vue-router, not use webpack
vue,vuex,vue-router放在一起能做什么?不用webpack之类的打包工具使用他们是否可行?各位道友在初学vue时是否有这样的困惑.因为现代构建前端项目的一般模式是: 安装webapck ...
- Spring应用上下文中Bean的生命周期
Bean装载到Spring应用上下文的生命周期,如图: Bean在Spring容器中从创建到销毁经历了若干个阶段,每一阶段都可以对Spring如何管理Bean进行个性化定制,以下我们通过代码去验证生命 ...
- 第二章:JavaScript对象
一.window对象 1.属性 2.方法 二.history对象 1.方法 三.location对象 1.属性 2.方法 四.Document对象 1.属性 2.方法
- 深度神经网络(DNN)损失函数和激活函数的选择
在深度神经网络(DNN)反向传播算法(BP)中,我们对DNN的前向反向传播算法的使用做了总结.里面使用的损失函数是均方差,而激活函数是Sigmoid.实际上DNN可以使用的损失函数和激活函数不少.这些 ...
- php 租房子(练习题)
一.题目要求 1.功能描述 出租房屋数据管理及搜索页面 2.具体要求 (1) 创建数据库HouseDB,创建表House,要求如下: 二.题目做法 1.建立数据库 2.封装类文件 <?php ...
- could not resolve host: github.com 问题解决办法
向github提交代码时出现问题,如图: 代码push失败,提示could not resolve host: github.com 解决办法: 1.打开终端,输入:ping github ...
- React Native填坑之旅 -- 使用iOS原生视图(高德地图)
在开发React Native的App的时候,你会遇到很多情况是原生的视图组件已经开发好了的.有的是系统的SDK提供的,有的是第三方试图组件,总之你的APP可以直接使用的原生视图是很多的.React ...
- 翻译:使用 Redux 和 ngrx 创建更佳的 Angular 2
翻译:使用 Redux 和 ngrx 创建更佳的 Angular 2 原文地址:http://onehungrymind.com/build-better-angular-2-application- ...
- VMware下ubuntu与Windows实现文件共享的方法
最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下,就进行了共享文件夹的设置,期间遇到一些困难,记录下来,方便以后遇到此类问题不再困惑. (记录只为更好的分享) 言归正传: 1 ...