- webpack.prod.js(webpack生产环境配置文件)
门板_
webpackjavascript前端
生产环境:只打包不运行本地服务器对于在config目录下的webpack.prod.js1.在根目录下运行npxwebpack--config./config/webpack.prod.js2.在package.json文件中配置"build":"npxwebpack--config./config/webpack.prod.js"constpath=require('path')constESL
- Webpack构建优化——区分环境
oWSQo
为什么需要区分环境在开发网页的时候,一般都会有多套运行环境,例如:在开发过程中方便开发调试的环境。发布到线上给用户使用的运行环境。这两套不同的环境虽然都是由同一套源代码编译而来,但是代码内容却不一样,差异包括:线上代码被特殊压缩过。开发用的代码包含一些用于提示开发者的提示日志,这些日志普通用户不可能去看它。开发用的代码所连接的后端数据接口地址也可能和线上环境不同,因为要避免开发过程中造成对线上数据
- html版本号 webpack_html-webpack-plugin详解
weixin_39994949
html版本号webpack
引言最近在react项目中初次用到了html-webapck-plugin插件,用到该插件的两个主要作用:为html文件中引入的外部资源如script、link动态添加每次compile后的hash,防止引用缓存的外部文件问题可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置N个html-webpack-plugin可以生成N个页面入口有了这种插件,那么在项目中遇到类似上面
- webpack-loader详解
奶昔不会射手
webpack前端node.js
一、loader的分类1.pre:前置loader2.normal:普通loader3.inline:内联loader4.post:后置loader二、执行顺序pre>normal>inline>post,相同类型的loader执行顺序为:从右到左,从下到上module:{rules:[{enforce:"pre",//通过这个参数来定义loader的类型,默认是normal类型test:/\.j
- webpack快速基础
风漫漫雨歇歇
webpackwebpack前端前端框架
文章目录webpack快速基础1.概念1.1入口1.2输出(output)1.3loader1.4插件(plugin)2.建立项目,用于测试功能2.1安装webpack,2.2创建webpack配置文件,2.3配置package.json,运行项目3.配置mode开发环境4.配置entry编译入口5.配置output编译出口6.配置加载csswebpack快速基础1.概念webpack是现代Jav
- Webpack打包
爱敲代码小黑
webpack前端node.js
Webpack打包目录Webpack打包打包图片资源模块类型(**assetmoduletype**)url-loader的limit效果打包图片我们当前使用的webpack版本是webpack5:在webpack5之前,加载这些资源我们需要使用一些loader,比如raw-loader、url-loader、file-loader;在webpack5开始,我们可以直接使用资源模块类型(ass
- vite和webpack的区别
小王学前端️
vue3webpack前端javascript
vite和webpack的区别从底层原理上来说,Vite是基于esbuild预构建依赖。而esbuild是采用go语言编写,因为go语言的操作是纳秒级别,而js是以毫秒计数,所以vite比用js编写的打包器快10-100倍。Vite和Webpack都是现代前端开发中的常见打包工具,但在实际使用过程中,它们存在五个主要区别:1.开发模式不同;2.打包效率不同;3.插件生态不同;4.配置复杂度不同;5
- ReferenceError: “Promise”未定义
吃不胖的茶叶蛋
问题现象:vue-cli项目在IE下运行,会在钩子函数出现ReferenceError:“Promise”未定义解决办法:1、安装BabelPolyfillnpminstall--savebabel-polyfill2、在webpack.base.conf.js这个文件加入代码require("babel-polyfill")3、在main.js里面添加代码import"babel-polyfil
- vue的路由懒加载
可爱的小小小狼
vue.js前端javascript
这样的懒加载机制确保了在初始加载时只加载必要的代码,提高了应用的性能和加载速度。当用户访问相关的懒加载路由时,相应的代码块才会被下载和执行。VueRouter的懒加载(也称为路由懒加载或异步组件加载)是一种优化手段,它允许你将路由组件按需加载,只在需要时才下载对应的代码块。这样可以减小初始加载的页面大小,提升应用的性能和加载速度。懒加载的原理基于Webpack的动态import()语法,它允许将模
- webpack和vite的区别是什么
蚂蚁上的大象
webpack前端node.js
Webpack和vite都是现在前端领域比较流行的打包工具,它们的相似之处在于可以帮助我们把多个JavaScript文件打包成一个可以在浏览器中加载并在生产中使用的文件。Webpack和vite主要区别:网上有很多总结大致分为三种,编译方式不同、开发效率不同、扩展性不同。其实在我看来只有一种半,一是编译方式,半个是生态。其实这半个也算是硬加上去的,以现在vite的发展势头,用不了多久它的生态不会弱
- Git提交规范
初学者↑
git
提交信息typefeat:新功能(feature)fix:修改bugdocs:文档修改style:代码格式修改(不影响代码运行的变动,例如分号修改),注意⚠️不是CSS修改refactor:代码重构test:测试用例修改build:影响项目构建或依赖项修改,如webpack版本升级等perf:性能优化revert:撤销之前的commitci:持续集成相关文件修改chore:其它修改(不在上述类型中
- webpack5高级--01_提升开发体验
化作繁星
webpackwebpackjavascript前端
提升开发体验SourceMap为什么开发时我们运行的代码是经过webpack编译后的,例如下面这个样子:/**ATTENTION:The"eval"devtoolhasbeenused(maybebydefaultinmode:"development").*Thisdevtoolisneithermadeforproductionnorforreadableoutputfiles.*Ituses
- webpack 中 loader 和 plugin 的区别
tangdou369098655
webpackwebpack
通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等loader:让webpack能够处理非js文件,然后你就可以利用webpack的打包能力,对它们进行处理。例如:css-loader、style-loader、postcss-loader、sass-loaderplugins:从打包优化和压缩,一直到重新定义环境中的变量.例如:uglify-webpack-plug
- 探索vue2框架的世界:关于vue2.x的性能优化和常见的白屏原因
@德玛玩前端
Vue性能优化学习前端htmlvuevue.js
在本篇文章中,博主总结了一些常见的vue2框架性能优化方法和项目启动出现白屏的原因,还望走过路过的同行和大神们点赞关注,多多指教,用你们发财的小手给予博主大大的鼓励。vue2x性能优化1.路由懒加载,有效拆分应用大小,访问时才异步加载vue是单页面应用,可能会有很多的路由引入,这样使用webpack打包后的文件会很大当进入首页时,加载的资源过多,页面会出现白屏的情况,不利于用户体验如果我们能把不同
- webpack 打包后,图片加载错误
佩淇呢
webpackVue2webpack前端node.jsjavascriptvue
使用webpack打包后,图片没有加载出来,页面空白,报错图片引用的路径不对解决办法:1.找到config->index.js将assetsPublicPath:'/',改为assetsPublicPath:'./'build:{index:path.resolve(__dirname,'../dist/index.html'),assetsRoot:path.resolve(__dirname,
- Webpack和Vite的区别?
夏兮颜☆
webpack前端javascript
Webpack和Vite都是现代前端开发中常用的打包工具,它们的主要区别如下:构建速度:Vite的构建速度比Webpack快得多,因为Vite在开发环境下使用了浏览器原生的ESM(ES6模块)模块加载,可以在浏览器中直接运行代码,而不需要像Webpack那样先进行打包和编译。在Vite中,每个模块都可以独立地进行编译和缓存,这意味着它只需要重新编译修改过地模块,而不是整个应用程序。这使得Vite开
- webpack5基础--11_处理 Html 资源
化作繁星
webpackhtml前端webpack
处理Html资源1.下载包npmihtml-webpack-plugin-D2.配置webpack.config.jsconstpath=require("path");constESLintWebpackPlugin=require("eslint-webpack-plugin");constHtmlWebpackPlugin=require("html-webpack-plugin");mod
- 前端面试练习24.3.5
程序猿online
前端面试前端面试职场和发展
webpack相关项目使用webpack流程进入一个初始化好的vue项目下载安装webpack相关依赖包/插件npminstall--save-devwebpackwebpack-cliwebpack-dev-server安装一些相关的loader,比如vue-loader,babel-loader,css-loader等创建webpack.config.js文件,进行相关配置文件内容如下cons
- vue-cli 项目中使用 webpack 的 require.context 实现全局引入组件
Enginner_XZ
文章内重点在于require.context的使用具体可查看webpack官网vue-cli工程建的项目components/index.js/***创建一个引入文件上下文*不懂上下文的参考语文对于上下文的理解及context的英语翻译*require.context的参数说明可查看webpack文档或百度高频组件引入*/constcomponentsContext=require.context
- webpack5基础--04_处理样式资源
化作繁星
webpackwebpack
处理样式资源本章节我们学习使用Webpack如何处理Css、Less、Sass、Scss、Styl样式资源介绍Webpack本身是不能识别样式资源的,所以我们需要借助Loader来帮助Webpack解析样式资源我们找Loader都应该去官方文档中找到对应的Loader,然后使用官方文档找不到的话,可以从社区Github中搜索查询Webpack官方Loader文档处理Css资源1.下载包npmics
- Webpack配置与运行基础教程
猿小白klp
Webpackwebpack前端node.js后端学习
在前端开发中,Webpack是一款非常流行的模块打包工具,它可以帮助我们将多个文件打包成一个或多个静态资源文件,从而提高前端项目的性能和可维护性。本文将为你介绍Webpack的基础配置和运行方法,帮助你快速上手Webpack。什么是WebpackWebpack是一个基于Node.js的模块打包工具,它可以将各种资源,如JavaScript、CSS、图片等,视为模块,并通过各种loader和插件对这
- Superset二次开发之Superset架构理解
aimmon
架构supersetBI
技术框架框架作用前端React构建用户界面的JavaScript库ReduxJavaScript应用的状态管理库,管理组件间的状态共享Webpack前端资源打包工具BabelJavaScript编译器D3.js数据可视化的JavaScript库后端Flask轻量级的Pythonweb框架,处理HTTP请求、路由以及其他Web服务功能SQLAlchemySQL工具包和对象关系映射(ORM)工具,处理
- Vue 起步
Kathy丶Andy
安装vueCli全局安装vue-cli$npminstall--globalvue-cli创建一个基于webpack模板的新项目$vueinitwebpackmy-project安装依赖,走你$cdmy-project$npminstall$npmrundev查看Vue版本命令vue-V注意是大写V
- vue 过滤服务器上的.svn文件
YellowPoint
服务器构建的时候多出了.svn的文件;本机只有svn的根目录才有.svn文件夹,服务器上发现每个文件夹都被加上了.svn;关键是在static文件夹里面也加了,vue构建的时候,是直接把static的文件全部复制到dist里面,故导致生成的文件夹里面也有.svn文件夹,在url上都能访问到里面的文件;想办法过滤这个文件夹吧,在webpack.dev.conf.js和webpack.prod.con
- 安装sass报错
逸笛
- webpack搭建前端环境
华戈的小书
随着webpack3.x的发布,其功能也越来越强大,很多的项目的编译打包工具也由gulp逐渐转移到webpack。1.用yarn代替npmnpm是一款非常好的包管理工具,之前在用npm安装项目依赖的时候总会因为某些依赖包推出了新版本从而导致编译结果不一样的问题,这是因为在安装依赖的时候npm并没有锁定依赖包的版本号(npm5好像已经解决了这个问题),每次安装的时候总是获取最新的依赖包,导致编译结果
- Vue-Quill-Editor 简单修改字体大小和样式.(不改源码)
十里冰香
富文本quill
实现效果图:vue-cli的富文本Vue-Quill-Editor使用前安装:npminstallquill-image-resize-module--save,npminstallvue-quill-editor--save需要在根目录下的vue.config.js文件里,添加如下chainWebpack:constwebpack=require('webpack')module.exports
- 9-区分开发环境配置 merge plugin
崩鲨卡拉卡
在development和production环境下将配置文件进行分类:dev、pro、base(公共)merge.jpg步骤:-1安装:yarnaddwebpack-merge-D本地安装插件-2新建webpacl.base.js、webpack.dev.js、webpack.prod.js,用作不同阶段环境的区分-3分别配置三个文件:以webpack.prod.js为例let{smart}=r
- 第六十五天 API安全-接口安全&WebPack&REST&SOAP&WSDL&WebService
清歌secure
网络安全全栈学习笔记安全web安全网络安全
第65天API安全-接口安全&WebPack&REST&SOAP&WSDL&WebService知识点1.HTTP类接口-测评2.RPC类接口-测评3.WebService类-测评参考链接:https://www.jianshu.com/p/e48db27d7c70内容点:SOAP(SimpleObjectAccessProtocol)简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的
- 客户端web开发工具
ww要努力呀
前端前端
文章目录安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack转换--Babel开发后阶段测试工具配置工具其他node,npm、yarnnode.js包管理器npmyarnhttps://developer.mozilla.org/zh-CN/docs/Learn/Tools_and_testing/
- 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发布消息