- JavaScript的那些不可不知的知识
遇见~未来
JavaScriptjavascript开发语言ecmascript
目录JavaScript基础JavaScript高级JavaScript基础数据类型:JavaScript的数据类型分为基本数据类型和引用数据类型。基本数据类型包含number(数字)、string(字符串)、boolean(布尔值)、null(空值)、undefined(未定义)。而像array(数组)、function(函数)等则属于引用数据类型。在内存存储方面,基本类型是按值存储在栈中,引用
- javamail发( 收)邮件
sageparadise
Javajavamailstringexception邮件服务器emailproperties
MyAuthenticator.javapackagecn.com.vetc.survey.mail;importjavax.mail.Authenticator;importjavax.mail.PasswordAuthentication;publicclassMyAuthenticatorextendsAuthenticator{privateStringuserName=null;priv
- JAVA基础语句整理
chengxuyuan66666
javapython开发语言
Java是一种广泛使用的面向对象编程语言,它具有简洁、强大、跨平台等特性。以下是Java中的一些基础语句和概念,适合初学者了解:1.类与对象Java是基于类的,程序的基本单位是类(class)。对象是类的实例。java复制代码//定义一个类publicclassPerson{//属性(成员变量)Stringname;intage;//方法(成员函数)voidintroduce(){System.o
- lombok常见注解概述,部分简单注解示例
小哇666
项目构建/代码管理lombok
Lombok常用的注解:注解描述@Getter/@Setter可以作用在类上和属性上,放在类上,会对所有的非静态(non-static)属性生成Getter/Setter方法,放在属性上,会对该属性生成Getter/Setter方法。并可以使用该注解中的AccessLevel属性来指定Getter/Setter方法的访问级别。@ToString生成toString方法,默认情况下,会输出类名、所有
- C#操作Xml节点
我曾经是个程序员
常用代码片段xmlc#
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看......1、增加节点publicstaticboolAppendChild(stringfilePath,stringxPath,XmlNodexmlNode){try{XmlDocumentdoc=newXmlDocument();doc.Load(filePath
- golang gorm 更新零值字段的方法
用户昵称不能为空
gogorm
坑使用golang的gorm更新0值的字段,总是失败。按照官方文档,如果字段值中有0值,不能再使用struct,而需要使用map[string]interface{},但实际上还是失败,比对了很久,才发现是在Updates方法不能传入map的指针,必须是map的值。错误的写法values:=map[string]interface{}{"status":0,"from":hash,
- golang gorm查询任意字段的组装方法
用户昵称不能为空
golang开发语言后端
查询指定未知长度字段的汇总方法packagemainimport("fmt""github.com/jinzhu/gorm"_"github.com/jinzhu/gorm/dialects/mysql""log""strings")typeFilterDostruct{}typeScanFieldsinterface{IsScanField()bool}typeSummarystruct{Num
- QWebEngineView之加载html打印PDF
学习,学习,在学习
笔记前端htmlqt5
QWebEngineView通过QWebEngineView加载html文件打印pdf相比自己手动绘制pdf简单的多,制作好对应的html文件,然后Qfile读取html文件模板,替换函数需要替换的value,存成html文件,然后QWebEngineView加载,就直接能够打印成对应格式的pdf了。//读取html文件QFileoutFile(QStringLiteral("C://Users/
- C++中的基本IO流
ITSOK_U
C++c++
IO流1.基本IO流1.1IO对象无拷贝无赋值1.2IO对象的条件状态1.3IO与缓冲2.文件IO流2.1使用ifstream读取文件内容2.1使用ofstream写文件3.stringIO类在C++中时不直接处理输入输出的,我们使用的是标准IO库来处理IO,这些库支持从文件、控制台窗口等读写数据,当然在C++中还有一些特殊的类型允许内存IO。比如我们就可以通过string进行读写数据。下面我们先
- 语句嵌套(for中for)、break(跳出)\continue(继续)
青木川崎
java
/*语句嵌套:就是语句中还有语句。现在要学的是循环嵌套。*/classForForDemo{publicstaticvoidmain(String[]args){for(intx=0;x<3;x++){for(inty=0;y<4;y++)//共打印12次ok。{System.out.println(“Ok”);}}}}打印星星1****2****3****4****classForForDemo
- 美图鉴赏-古风,OpenCV视频批量处理
图苑
java图像处理AIGCopencv
publicstaticvoidmixBatch(StringoutputPath,ListvideoList,intclipDuration,intnumber,intmergeDuration,ProgressCallbackcallback)throwsException{//临时裁剪文件夹StringclipTempDir=outputPath+File.separator+"_clipT
- 【LeetCode 刷题】字符串-反转字符串
Bran_Liu
LeetCodeleetcode算法
此博客为《代码随想录》字符串章节的学习笔记,主要内容为反转字符串相关的题目解析。文章目录344.反转字符串541.反转字符串II151.反转字符串中的单词344.反转字符串题目链接classSolution:defreverseString(self,s:List[str])->None:"""Donotreturnanything,modifysin-placeinstead."""left,r
- 融云 IM 干货丨私有云IMKit支持哪些国家的语言?
融云即时通讯im
私有云IMKit支持以下国家的语言:默认支持的语言简体中文(zh_CN)英语(en_US)阿拉伯语(ar)其他语言支持除了上述默认支持的语言外,IMKit还支持通过客户端单独适配其他语言。例如,可以通过以下步骤添加日语支持:创建Localizations:选择日语。创建Strings文件:命名必须和SDK的国际化文件一致,例如RongCloudKit。设置对应语言的文案:将IMKit内置的Rong
- Kotlin Bootcamp 自学(2):Kotlin基础
EdwardW@ng
kotlinjavaandroid
KotlinBootcamp自学(2):Kotlin基础目录KotlinBootcamp自学(2):Kotlin基础前言运算符与数据类型(OperatorsandTypes)数值类型(NumericalType)练习使用数据类型字符串(String)比较条件和布尔值(Boolean)比较符号if...else...关于空值(Nullability)关于array,list,和loopListArr
- 关于StringBuilder扩容机制的理解
司空怡瑾
java开发语言
一.为什么要用StringBuilder?在java中由于字符串的不可变性,即一旦创建就不能修改其内容,每次使用String类进行字符串拼接时,都会创建一个新的String对象,原有的String对象会被丢弃,为了解决这一问题,我们引入了StringBuilder类,StringBuilder是一个可变的字符序列,允许在原对象上进行修改,避免了创建大量的中间对象。二.StringBuilder的扩
- Java基础——String
白暮晚
Java八股java
Java基础——StringString是Java基础类型中较为特殊的一个类,我们这里着重探讨一下这个类。StringString底层使用一个char类型的数组来存储字符串,且该数组使用了private和final修饰为什么说String是不可变的final与private修饰该字符数组且未暴露修改方法,杜绝了从外部修改该对象的可能性由于final的使用导致子类无法继承该对象,进而导致子类不可能修
- vue3实现搜索关键字高亮
前后端都会点儿
javascriptvue.js前端
其实这个需求非常常见,平时用app、浏览网页时都能用到,那具体是怎么实现的?我做了小案例,先看下效果我们先梳理下这个需求获取搜索关键字,并过滤出符合条件的数据匹配出要高亮的关键字增加样式那其实关键点就在于怎么匹配,如何高亮?这里我们使用正则匹配,再用replace替换,replace的第二个参数也可以是函数,接受的值就是正则匹配到的值:constsearchKey=(val:string)=>{i
- JSON数据格式转换
百事老饼干
前端积累json
在前端Vue3中,处理JSON数据通常涉及到从API获取JSON、解析JSON数据、或者将JavaScript对象转换为JSON字符串。这里是几种常见的JSON转换操作一、从JSON字符串解析为JavaScript对象如果你从API或其他地方收到一个JSON字符串,可以使用JSON.parse()来将它转换为JavaScript对象。letjsonString='{"name":"John","a
- Python 删除文件与文件夹 - 奇客谷教程
八狐云|酷画册|二维码生成
pythonPython教程python
Python教程Python介绍Python开发环境搭建Python语法Python变量Python数值类型Python类型转换Python字符串(String)Python运算符Python列表(list)Python元组(Tuple)Python集合(Set)Python字典(Dictionary)PythonIf…ElsePythonWhile循环PythonFor循环Python函数Pyt
- 封装Redis工具类(解决击穿,穿透)
Li清水
Redisredis数据库缓存
基于StringRedisTemplate封装一个缓存工具类Redis实战篇|Kyle'sBlog(cyborg2077.github.io)目录方法1:将任意Java对象序列化为JSON,并存储到String类型的Key中,并可以设置TTL过期时间方法2:将任意Java对象序列化为JSON,并存储在String类型的Key中,并可以设置逻辑过期时间,用于处理缓存击穿问题方法3:根据指定的Key查
- 2.slf4j入口
uncleqiao
slf4jslf4j
文章目录一、故事引入二、原理探究三、SLF4JServiceProvider四、总结一、故事引入故事要从下面这段代码说起publicclassApp{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(App.class);publicstaticvoidmain(String[]args)throwsException{logger.in
- 【Java数据结构】Java对象的比较
回响N
数据结构java
元素的比较基本类型比较在Java中基本类型比较可以直接比较大小,返回一个布尔类型(true或者false)。inta=10;intb=20;System.out.println(a>b);System.out.println(a=b);System.out.println(a{publicStringname;@OverridepublicintcompareTo(Studento){//重写co
- PHP xml 常用函数整理
請叫我菜鳥
php开发语言
————————-DOM函数————————————–1、DOMDocument->load()作用:加载xml文件用法:DOMDocument->load(stringfilename)参数:filename,xml文件;返回:如果成功则返回TRUE,失败则返回FALSE。2、DOMDocument->loadXML()作用:加载xml代码用法:DOMDocument->loadXML(stri
- 【Javascript Day11】数组的内置方法、添加获取、元素查询及练习、排序方法数组的内置方法
clp20031101
javascript前端开发语言
数组的内置方法//js语法中所有的数据类型都是从对象演变而来的varstr="abc";console.log(typeofstr,str.constructor);//stringconsole.log(typeofstr=="string");varuser={};console.log(typeofuser,user.constructor);vararr=[1,2];console.log
- python中判断字符串值是否为数字
上趣工作室
pythonpython开发语言
使用isdigit()方法:这个方法返回一个布尔值,如果字符串只包含数字字符,则返回True,否则返回False。string="12345"ifstring.isdigit():print("是数字")else:print("不是数字")使用isnumeric()方法:这个方法类似于isdigit()方法,但它还可以识别其他数字字符,例如Unicode数字字符。同样,它返回一个布尔值。strin
- leetcode 66 :加一【JavaScript/JS解法】
yuri.css
算法leetcode算法javascript
还是先上题给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。看完题之后感受就是join和split来回跳return(Number(digits.join(""))+1n).toString().split("");然后出现两个问题:1存在[0,0]这样的输入,如果直接转换为零
- C/C++中的strcmp函数的源代码
凌龍墨
C语言c语言中strcm的源代码strcmp函数
附上源代码,不懂得地方可以提问共同提高`#includeintmy_strcmp(constchar*string1,constchar*string2){intret=0;while(!(ret=*(unsignedchar*)string1-*(unsignedchar*)sting2)&&*string2){//从两个字符串的首字母开始比较,相等则进入循环,继续后面字符的比较++string
- 如何使用IDE的代码自动生成功能提升开发效率
默 语
#ideaspringboot
摘要在日常的Java开发过程中,IDE(集成开发环境)是每个开发者的得力助手。对于Java开发者来说,如何高效地使用IDE的自动生成功能,可以大大提升编程效率,减少重复性工作。本篇博客将介绍如何利用IntelliJIDEA和Eclipse自动生成getter、setter、toString方法,以及如何使用快捷键生成构造函数,帮助你更加高效地进行开发。引言Java是一种强类型、面向对象的编程语言。
- C#html生成pdf之wkhtmltopdf及参数说明
Mick_小马哥
C#WEBc#htmlpdf
实现方法#regionHTML生成PDF//////HTML生成PDF//////页面URL如:http://127.0.0.1/index.html///保存地址如:/upload/pdf/123.pdf///publicstaticboolHtmlToPdf(stringurl,stringpath){if(string.IsNullOrEmpty(url)||string.IsNullOrE
- 【c++】【算法】【动态规划】最长公共子序列
钟离墨笺
算法算法c++动态规划
【c++】【算法】【动态规划】最长公共子序列//递归方式//最长公共子序//直接递归求最长公共子序长度intFindValue(conststring&X,conststring&Y,inti,intj){if(i==0||j==0)return0;if(X[i]==Y[j])returnFindValue(X,Y,i-1,j-1)+1;elsereturnstd::max(FindValue(X
- 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发布消息