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的值加 ...
随机推荐
- oozie配置安装与原理
概述 当前开源的hadoop任务工作流管理主要有oozie和Azkaban,本文先介绍oozie的配置安装与基本运行原理. 配置安装 (参考https://segmentfault.com/a/11 ...
- 剑指offer编程题Java实现——替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...
- Spring源码解析三:IOC容器的依赖注入
一般情况下,依赖注入的过程是发生在用户第一次向容器索要Bean是触发的,而触发依赖注入的地方就是BeanFactory的getBean方法. 这里以DefaultListableBeanFactory ...
- 利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app
由于前几天要给工厂app和bootloader的hex的文件,网上很多都是bin的合并方法,bin的方法不再赘述,相信大家都能找到,现在将hex合并的方法写下来: 第一步:先打开第一个hex文件, 第 ...
- 【Scala】Scala之Methods
一.前言 前面学习了Scala的Class,下面接着学习Method(方法). 二.Method Scala的方法与Java的方法类似,都是添加至类中的行为,但是在具体的实现细节上差异很大,下面展示一 ...
- Node.js~在linux上的部署
我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesourc ...
- AR入门系列-03-在unity中将调试好的Vuforia项目导出为APK
先设置build settings 选中Android后点击Player Settings Product Name设置安装后的Android程序的名字 Bundle Identifier 设置apk ...
- Javaweb之Servlet入门
1. 什么是Servlet? Java Servlet 是运行在 Web 服务器或应用服务器上的程序:他是浏览器(HTTP客户端)请求和HTTP服务器上资源(访问数据库)之间的中间层. 2. 什么是S ...
- ROJ 1166 超级贞鱼
1166: 超级贞鱼 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status] 传送门 Description 马达加斯加贞鱼是一种神奇的双脚贞 ...
- wemall app中基于Java获取和保存图片的代码
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.分享其中关于 保存正在下载的图片URL集合和图片三种获 ...