- Collecting Numbers II
YouQian772
数学排序算法
题目描述Youaregivenanarraythatcontainseachnumberbetween1...nexactlyonce.Yourtaskistocollectthenumbersfrom1toninincreasingorder.Oneachround,yougothroughthearrayfromlefttorightandcollectasmanynumbersaspossi
- 《剑指offer》-数据结构篇-哈希表/数组/矩阵/字符串
小新学习屋
数据结构与算法数据结构leetcode哈希表
题目第一个只出现一次的字符数组中的重复的数字字符串流中第一个不重复的字符数组中只出现一次的数字调整数组顺序使奇数位于偶数前面数组中出现次数超过一半的数字把数组排成最小的数顺时针打印矩阵把字符串转换为整数表示数值的字符串左旋转字符串(矩阵翻转)替换空格正则表达式匹配代码实现第一个只出现一次的字符题目描述:在一个字符串(0len(numbers)/2:returnreselse:return0把数组排
- Go实战(三)-数组array、切片slice语法详解
2401_87198334
golang开发语言后端
为何使用range意义明确,美观C++:没有类似能力Java/Python:只能foreachvalue,不能同时获取i,V访问越界如果下标在数组合法范围之外,则触发访问越界,会panic1.3数组是值类型赋值和传参会复制整个数组,而非指针。因此改变副本的值,不会改变本身的值。[10]int和[20]int是不同类型调用funcf(arr[10]int)会拷贝数组,支持“==”、“!=”操作符,因
- python性能检测工具函数运行内存及运行时间
程序员Baby~
python软件测试程序员接口测试自动化测试测试工程师
前言:python虽然是一门'慢语言',但是也有着比较多的性能检测工具来帮助我们优化程序的运行效率。这里总结了五个比较好的python性能检测工具,包括内存使用、运行时间、执行次数等方面。首先,来编写一个基础的python函数用于在后面的各种性能测试。123defbase_func():forninrange(10000):print('当前n的值是:{}'.format(n))1、memory_
- Redis - ZSet数据结构与滑动窗口应用
Redis的ZSET(有序集合)是一种结合了哈希表和跳跃表(SkipList)的混合数据结构,既能实现O(1)复杂度的成员存在性判断,又能以O(logN)复杂度维护有序性。RedisZSET数据存储机制ZSET有两种实现机制:SkipList+HashTable数据实际上是同时存在于两个数据结构中的跳表(SkipList)按score排序存储member支持范围查询(ZRANGE等命令)维护成员的
- 关于飞行-飞机的导航03_VOR/DME导航
心已远_Ma_Vie
VOR的中文意思是甚高频全向无线电信标,它的英文全称是VeryhighfrequencyOmmi-directionalRange。VOR信号发射机和接收机的工作频率在108.0-117.95MHz之间。VOR台站发射机发送的信号有两个:一个是相位固定的基准信号;另一个信号的相位是变化的,同时象灯塔的旋转探照灯一样向360度的每一个角度发射,而向各个角度发射的信号的相位都是不同的,它们与基准信号的
- 优化Linux高并发:文件描述符与端口范围的协同调优
算法小生Đ
精选实践linux运维服务器
既然已经通过调整nofile(最大文件描述符数量)来支持高并发,为什么还需要调整net.ipv4.ip_local_port_range(本地端口范围)?这两个参数看似都与高并发有关,但它们的作用和影响范围不同。1.文件描述符和端口范围的区别要弄清楚为什么需要同时调整nofile和net.ipv4.ip_local_port_range,我们先来看它们的定义和作用:1.1文件描述符(nofile)
- 【CSS3】 结构性伪类选择器—root
badlyForPapers
:root选择器,从字面上我们就可以很清楚的理解是根选择器,他的意思就是匹配元素E所在文档的根元素。在HTML文档中,根元素始终是。示例演示:通过“:root”选择器设置背景颜色HTML代码::root选择器的演示CSS代码::root{background:orange;}演示结果:“:root”选择器等同于元素,简单点说::root{background:orange}html{backgro
- 反向波动策略思路
量化金策
量化交易策略思路python编辑器开发语言
反向波动策略是一种自动化交易系统,综合考虑市场进入、退出及反向操作机制,捕捉市场趋势并管理风险。该策略的核心逻辑包括设定买卖点位、动态调整头寸方向、设定利润目标和止损点,以及利用TrueRange决定订单价格。策略还具备反向操作能力,提高灵活性以适应市场趋势变化。此外,策略还包括一套标准退出机制,为市场出现快速不利变动时提供额外保护层。最终的精简版本策略优化了入市时机,确保及时参与市场,并强化风险
- Python 数据科学与可视化工具箱 (一) - 数组创建:array(), arange(), zeros(), ones(), linspace()
文章目录1.为什么需要NumPy数组创建函数?2.核心数组创建函数详解2.1`np.array()`:从现有数据创建数组2.2`np.arange()`:创建等差序列2.3`np.zeros()`:创建全零数组2.4`np.ones()`:创建全一数组2.5`np.linspace()`:创建等间隔序列3.其他常用数组创建函数(简要提及)总结练习题练习题答案创作不易,请各位看官顺手点点关注,不胜感
- 45. leetcode 504. Base 7
504.Base7Givenaninteger,returnitsbase7stringrepresentation.Example1:Input:100Output:"202"Example2:Input:-7Output:"-10"Note:Theinputwillbeinrangeof[-1e7,1e7].思路:辗转相除法。转载于:https://www.cnblogs.com/vincen
- Pytorch自定义优化器最佳实践
在PyTorch中,自定义优化器需要遵循特定的规范以兼容PyTorch的训练流程。下面从核心方法、closure的作用,到Ranger优化器的实现,逐步展开说明。一、PyTorch自定义优化器的必要方法自定义优化器必须继承torch.optim.Optimizer,并实现以下核心方法:init(self,params,defaults)作用:初始化优化器,定义超参数(如学习率、动量等),并为参数组
- vben-admin 时间/日期选择器年-季-月
CDwenhuohuo
前端javascripthtml
DatePicker日期选择器RangePicker偏向于时间选择器--------------------------------------------------------------季度{field:'startDatetime',label:'出库日期',component:'DatePicker',colProps:{span:8},componentProps:{picker:'q
- C++枚举:enum与enum class
qq_38196982
C++
1.enumC++中enum提供了另一种创建符号常量的方法,这种方式可以替代const。enum也允许定义新类型,使用enum的语法与使用结构相似。如对下述示例:enumcolor{red,orange,yellow,black};有2个含义:1)color称为新类型的名称,color被称为枚举,如同struct被称为结构体一个道理2)red,orange,yellow,black等为符号常量,默
- LeetCode | 0994. Rotting Oranges腐烂的橘子【Python】
Wonz
LeetCode0994.RottingOranges腐烂的橘子【Easy】【Python】【BFS】ProblemLeetCodeInagivengrid,eachcellcanhaveoneofthreevalues:thevalue0representinganemptycell;thevalue1representingafreshorange;thevalue2representinga
- Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
我命由我12345
Kotlin-极简小抄kotlinlistwindows开发语言java-eejavajvm
一、List概述List是一个不可变的有序集合,一旦创建就不能修改其内容,即不能添加、删除、更改元素List提供了丰富的操作函数来处理数据二、创建List1、基础创建通过listOf函数创建(推荐)//创建一个List,包含3个元素valfruitList=listOf("Apple","Banana","Orange")println("fruitList:$fruitList")#输出结果fr
- vscode 的 settings.json
Lovely Ruby
#工作vscodejsonide
基本的配置在antfu基础上更改了command按键的功能字体白天黑夜的主题更改{//==========Visuals=========="editor.cursorSmoothCaretAnimation":"on","editor.fontFamily":"Input","editor.guides.bracketPairs":"active","editor.lineNumbers":"i
- 二分查找:区间内查询数字的频率
nako_sayuri
算法数据结构
请你设计一个数据结构,它能求出给定子数组内一个给定值的频率。子数组中一个值的频率指的是这个子数组中这个值的出现次数。请你实现RangeFreqQuery类:RangeFreqQuery(int[]arr)用下标从0开始的整数数组arr构造一个类的实例。intquery(intleft,intright,intvalue)返回子数组arr[left...right]中value的频率。一个子数组指的
- 【leetcode】169、Majority Element
潇湘demi
翻译找出多数,出现>n/2次的元素。思路Moorevotingalgorithm--每找出两个不同的element,就成对删除即count--,最终剩下的一定就是所求的(多数的元素>n/2)。时间复杂度:O(n)a=["a","c","b","c","a","a","a"]deffind_majory_number(a):count=0foriinrange(len(a)):ifcount==0:
- LeetCode 167.两数之和2-输入有序数组
吃着火锅x唱着歌
LeetCodeleetcode算法职场和发展
给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2],则1twoSum(vector&numbers,inttarget){intleft=0;intright=numbers.size()-1;while(lefttarget){--r
- 搞定leetcode面试经典150题之区间
系列博客目录文章目录系列博客目录228.汇总区间56合并区间57.插入区间452.用最少数量的箭引爆气球228.汇总区间链接自己的思路:先排序,然后设置number来知道连续的子区间有几个数字方便后续处理。如果当前数字和前面数字不连续,就把前面数字根据number做处理。classSolution{publicListsummaryRanges(int[]nums){Liststrings=new
- Python中的循环
久未放晴的天空@
python开发语言
目录for循环while循环break与continue循环与else一、for循环for循环用于迭代可迭代对象(如列表、字符串、字典等),语法如下:for变量in可迭代对象:#循环体示例:遍历列表并打印每个元素fruits=["apple","banana","cherry"]forfruitinfruits:print(fruit)range()函数常与for循环结合使用,生成数字序列:for
- Codeforces Round 958 (Div. 2 ABCDE题) 视频讲解
阿史大杯茶
Codeforces算法c++数据结构
A.SplittheMultisetProblemStatementAmultisetisasetofnumbersinwhichtherecanbeequalelements,andtheorderofthenumbersdoesnotmatter.Forexample,{2,2,4}\{2,2,4\}{2,2,4}isamultiset.YouhaveamultisetSSS.Initiall
- python常见语法总结-打印函数
程正发
python开发语言
1.\n换行print(’‘)打印函数print('\n'.join(['\t'.join([f"{j}×{i}={i*j}"forjinrange(1,i+1)])foriinrange(1,10)]))Python打印函数用法详解1.基本打印python复制print("Hello,World!")输出:复制Hello,World!2.打印多个变量(默认用空格分隔)python复制name="
- Kotlin基础2
翻跟头的牛爷爷
kotlin开发语言android
查看Kotlin编译之后的字节码,有助于我们深入理解Kotlin语言两种方式:Shift键两次,输入Showkotlin.Tools->Kotlin->ShowKotlinBytecodeJava有两种数据类型:引用类型,基本数据类型Kotlin只提供引用数据类型这一种数据类型,出于高性能的需要,Kotlin编译器会在Java字节码中改用基本数据类型。range表达式inA..B,in关键字用来检
- opencv-图像处理
芒果快进我嘴里
opencv计算机视觉人工智能
彩色图像HSV色调、饱和度、亮度gray是灰度图像颜色追踪(inRange的使用)hsv=cv.cvtColor(frame,cv.COLOR_BGR2HSV)lower_hsv=np.array([11,43,46])upper_hsv=np.array([25,255,255])mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)inRa
- Python推导式,常见语句和内置函数
拉不拉嘟妍
算法
目录1.Python推导式1.1列表推导式1.2字典推导式1.3集合推导式2.常见语句2.1赋值语句2.2条件语句2.2.1if-elif-else2.2.3match-case2.3循环语句2.3.1for循环2.3.2while循环2.3.3range2.4循环控制语句2.4.1break2.4.2continue2.4.3pass2.5函数定义语句2.6异常处理语句2.6.1try-exce
- python排序算法之桶排序
华强笔记
python数据结构和算法python算法
桶排序主要适用于全是数字的列表排序代码如下:defbuckrt_sort(li,n=100,max_num=10000):bucket=[[]for_inrange(n)]
- iOS 解析URL中的参数生成NSMutableDictionary
舒翱
#pragmamark-解析url中的参数,生成NSMutableDictionary-(NSMutableDictionary*)getURLParameters:(NSString*)urlStr{//查找参数NSRangerange=[urlStrrangeOfString:@"?"];if(range.location==NSNotFound){returnnil;}//以字典形式将参数返
- 【CSDN周赛29期】
T1订班服小A班级订班服了!可是小A是个小糊涂鬼,整错了好多人的衣服的大小。小A只能自己掏钱包来补钱了。小A想知道自己至少需要买多少件衣服。n=int(input())num1=[]num2=[]ans=0foriinrange(n):num1.append(input())foriinrange(n):num2.append(input())num=["M","S","L","XL","XLL"
- jQuery 键盘事件keydown ,keypress ,keyup介绍
107x
jsjquerykeydownkeypresskeyup
本文章总结了下些关于jQuery 键盘事件keydown ,keypress ,keyup介绍,有需要了解的朋友可参考。
一、首先需要知道的是: 1、keydown() keydown事件会在键盘按下时触发. 2、keyup() 代码如下 复制代码
$('input').keyup(funciton(){  
- AngularJS中的Promise
bijian1013
JavaScriptAngularJSPromise
一.Promise
Promise是一个接口,它用来处理的对象具有这样的特点:在未来某一时刻(主要是异步调用)会从服务端返回或者被填充属性。其核心是,promise是一个带有then()函数的对象。
为了展示它的优点,下面来看一个例子,其中需要获取用户当前的配置文件:
var cu
- c++ 用数组实现栈类
CrazyMizzz
数据结构C++
#include<iostream>
#include<cassert>
using namespace std;
template<class T, int SIZE = 50>
class Stack{
private:
T list[SIZE];//数组存放栈的元素
int top;//栈顶位置
public:
Stack(
- java和c语言的雷同
麦田的设计者
java递归scaner
软件启动时的初始化代码,加载用户信息2015年5月27号
从头学java二
1、语言的三种基本结构:顺序、选择、循环。废话不多说,需要指出一下几点:
a、return语句的功能除了作为函数返回值以外,还起到结束本函数的功能,return后的语句
不会再继续执行。
b、for循环相比于whi
- LINUX环境并发服务器的三种实现模型
被触发
linux
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器。按处理方式来分有循环服务器和并发服务器。
1 循环服务器与并发服务器模型
在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求。
目前最常用的服务器模型有:
·循环服务器:服务器在同一时刻只能响应一个客户端的请求
·并发服务器:服
- Oracle数据库查询指令
肆无忌惮_
oracle数据库
20140920
单表查询
-- 查询************************************************************************************************************
-- 使用scott用户登录
-- 查看emp表
desc emp
- ext右下角浮动窗口
知了ing
JavaScriptext
第一种
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/
- 浅谈REDIS数据库的键值设计
矮蛋蛋
redis
http://www.cnblogs.com/aidandan/
原文地址:http://www.hoterran.info/redis_kv_design
丰富的数据结构使得redis的设计非常的有趣。不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与。redis的DBA需要熟悉数据结构,并能了解使用场景。
- maven编译可执行jar包
alleni123
maven
http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven
<build>
<plugins>
<plugin>
<artifactId>maven-asse
- 人力资源在现代企业中的作用
百合不是茶
HR 企业管理
//人力资源在在企业中的作用人力资源为什么会存在,人力资源究竟是干什么的 人力资源管理是对管理模式一次大的创新,人力资源兴起的原因有以下点: 工业时代的国际化竞争,现代市场的风险管控等等。所以人力资源 在现代经济竞争中的优势明显的存在,人力资源在集团类公司中存在着 明显的优势(鸿海集团),有一次笔者亲自去体验过红海集团的招聘,只 知道人力资源是管理企业招聘的 当时我被招聘上了,当时给我们培训 的人
- Linux自启动设置详解
bijian1013
linux
linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。
阅读之前建议先看一下附图。
本文中假设inittab中设置的init tree为:
/etc/rc.d/rc0.d
/etc/rc.d/rc1.d
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc
- Spring Aop Schema实现
bijian1013
javaspringAOP
本例使用的是Spring2.5
1.Aop配置文件spring-aop.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmln
- 【Gson七】Gson预定义类型适配器
bit1129
gson
Gson提供了丰富的预定义类型适配器,在对象和JSON串之间进行序列化和反序列化时,指定对象和字符串之间的转换方式,
DateTypeAdapter
public final class DateTypeAdapter extends TypeAdapter<Date> {
public static final TypeAdapterFacto
- 【Spark八十八】Spark Streaming累加器操作(updateStateByKey)
bit1129
update
在实时计算的实际应用中,有时除了需要关心一个时间间隔内的数据,有时还可能会对整个实时计算的所有时间间隔内产生的相关数据进行统计。
比如: 对Nginx的access.log实时监控请求404时,有时除了需要统计某个时间间隔内出现的次数,有时还需要统计一整天出现了多少次404,也就是说404监控横跨多个时间间隔。
Spark Streaming的解决方案是累加器,工作原理是,定义
- linux系统下通过shell脚本快速找到哪个进程在写文件
ronin47
一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用lsof也没找到
这个问题挺有普遍性的,解决方法应该很多,这里我给大家提个比较直观的方法。
linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode。
幸运的是systemtap的安装包里带了inodewatch.stp,位
- java-两种方法求第一个最长的可重复子串
bylijinnan
java算法
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MaxPrefix {
public static void main(String[] args) {
String str="abbdabcdabcx";
- Netty源码学习-ServerBootstrap启动及事件处理过程
bylijinnan
javanetty
Netty是采用了Reactor模式的多线程版本,建议先看下面这篇文章了解一下Reactor模式:
http://bylijinnan.iteye.com/blog/1992325
Netty的启动及事件处理的流程,基本上是按照上面这篇文章来走的
文章里面提到的操作,每一步都能在Netty里面找到对应的代码
其中Reactor里面的Acceptor就对应Netty的ServerBo
- servelt filter listener 的生命周期
cngolon
filterlistenerservelt生命周期
1. servlet 当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后调用它的service方法处理请求。当第二次请求这个servlet资源时,servlet容器就不在创建实例,而是直接调用它的service方法处理请求,也就是说
- jmpopups获取input元素值
ctrain
JavaScript
jmpopups 获取弹出层form表单
首先,我有一个div,里面包含了一个表单,默认是隐藏的,使用jmpopups时,会弹出这个隐藏的div,其实jmpopups是将我们的代码生成一份拷贝。
当我直接获取这个form表单中的文本框时,使用方法:$('#form input[name=test1]').val();这样是获取不到的。
我们必须到jmpopups生成的代码中去查找这个值,$(
- vi查找替换命令详解
daizj
linux正则表达式替换查找vim
一、查找
查找命令
/pattern<Enter> :向下查找pattern匹配字符串
?pattern<Enter>:向上查找pattern匹配字符串
使用了查找命令之后,使用如下两个键快速查找:
n:按照同一方向继续查找
N:按照反方向查找
字符串匹配
pattern是需要匹配的字符串,例如:
1: /abc<En
- 对网站中的js,css文件进行打包
dcj3sjt126com
PHP打包
一,为什么要用smarty进行打包
apache中也有给js,css这样的静态文件进行打包压缩的模块,但是本文所说的不是以这种方式进行的打包,而是和smarty结合的方式来把网站中的js,css文件进行打包。
为什么要进行打包呢,主要目的是为了合理的管理自己的代码 。现在有好多网站,你查看一下网站的源码的话,你会发现网站的头部有大量的JS文件和CSS文件,网站的尾部也有可能有大量的J
- php Yii: 出现undefined offset 或者 undefined index解决方案
dcj3sjt126com
undefined
在开发Yii 时,在程序中定义了如下方式:
if($this->menuoption[2] === 'test'),那么在运行程序时会报:undefined offset:2,这样的错误主要是由于php.ini 里的错误等级太高了,在windows下错误等级
- linux 文件格式(1) sed工具
eksliang
linuxlinux sed工具sed工具linux sed详解
转载请出自出处:
http://eksliang.iteye.com/blog/2106082
简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾
- Android应用程序获取系统权限
gqdy365
android
引用
如何使Android应用程序获取系统权限
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点
- HoverTree开发日志之验证码
hvt
.netC#asp.nethovertreewebform
HoverTree是一个ASP.NET的开源CMS,目前包含文章系统,图库和留言板功能。代码完全开放,文章内容页生成了静态的HTM页面,留言板提供留言审核功能,文章可以发布HTML源代码,图片上传同时生成高品质缩略图。推出之后得到许多网友的支持,再此表示感谢!留言板不断收到许多有益留言,但同时也有不少广告,因此决定在提交留言页面增加验证码功能。ASP.NET验证码在网上找,如果不是很多,就是特别多
- JSON API:用 JSON 构建 API 的标准指南中文版
justjavac
json
译文地址:https://github.com/justjavac/json-api-zh_CN
如果你和你的团队曾经争论过使用什么方式构建合理 JSON 响应格式, 那么 JSON API 就是你的 anti-bikeshedding 武器。
通过遵循共同的约定,可以提高开发效率,利用更普遍的工具,可以是你更加专注于开发重点:你的程序。
基于 JSON API 的客户端还能够充分利用缓存,
- 数据结构随记_2
lx.asymmetric
数据结构笔记
第三章 栈与队列
一.简答题
1. 在一个循环队列中,队首指针指向队首元素的 前一个 位置。
2.在具有n个单元的循环队列中,队满时共有 n-1 个元素。
3. 向栈中压入元素的操作是先 移动栈顶指针&n
- Linux下的监控工具dstat
网络接口
linux
1) 工具说明dstat是一个用来替换 vmstat,iostat netstat,nfsstat和ifstat这些命令的工具, 是一个全能系统信息统计工具. 与sysstat相比, dstat拥有一个彩色的界面, 在手动观察性能状况时, 数据比较显眼容易观察; 而且dstat支持即时刷新, 譬如输入dstat 3, 即每三秒收集一次, 但最新的数据都会每秒刷新显示. 和sysstat相同的是,
- C 语言初级入门--二维数组和指针
1140566087
二维数组c/c++指针
/*
二维数组的定义和二维数组元素的引用
二维数组的定义:
当数组中的每个元素带有两个下标时,称这样的数组为二维数组;
(逻辑上把数组看成一个具有行和列的表格或一个矩阵);
语法:
类型名 数组名[常量表达式1][常量表达式2]
二维数组的引用:
引用二维数组元素时必须带有两个下标,引用形式如下:
例如:
int a[3][4]; 引用:
- 10点睛Spring4.1-Application Event
wiselyman
application
10.1 Application Event
Spring使用Application Event给bean之间的消息通讯提供了手段
应按照如下部分实现bean之间的消息通讯
继承ApplicationEvent类实现自己的事件
实现继承ApplicationListener接口实现监听事件
使用ApplicationContext发布消息