- 如何利用Samba跨平台分享Ubuntu文件夹
GottenZZP
部署相关ubuntulinux运维
1.安装Samba终端输入sudoaptinstallsamba2.配置Samba终端输入sudovim/etc/samba/smb.conf打开配置文件滑动文件到最底下输入以下内容[Share]#要共享的文件夹路径path=/home/xxx/sambasharereadonly=nobrowsable=yes编辑完成后按一下Esc按键后输入:wq回车保存3.重启Samba服务终端输入sudos
- VBA程序xlsm文件另存xlsx不能保存的问题
文剑至秦
编程excel
表达式.SaveAs(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)1.首先看看FileFormat可选Variant保存文件时使用的文件
- c语言atomic能用数组的,属性关键字
非著名程序~~~
c语言atomic能用数组的
一.属性关键字的分类?读写权限:readonly、readwrite(默认)原子相关:atomic(默认)、nonatomic(常用)aomic:可以保证赋值和获取是线程安全的。指的是成员属性直接的获取和赋值,不包括操作和访问。eg:用atomic修饰数组,获取和赋值保证线程安全,添加、移除对象,是不保证线程安全的。引用计数retain(mrc)、strong(arc):修饰对象assign(修饰
- c#--实现23种常见的设计模式动态汇总
@Crazy Snail
C#新手村c#设计模式开发语言
设计模式通常分为三个主要类别:创建型模式结构型模式行为型模式。这些模式是用于解决常见的对象导向设计问题的最佳实践。以下是23种常见的设计模式并且提供c#代码案例:创建型模式:1.单例模式(Singleton)public sealed class Singleton{ //创建一个只读的静态Singleton实例 private static readonly Singleton in
- PyQt5——QLineEdit(单行文本框控件)
weixin_41881387
qt开发语言
一、简介QLineEdit:单行文本框控件二、常用方法方法描述text()返回文本框的内容setText()设置文本框的内容setReadOnly()设置文本为只读setMaxLength()设置文本框所允许输入的最大字符数setDragEnable()设置文本框是否接受拖动setValidator()设置文本框的验证器(验证规则),将限制任意可能输入的文本,可用的校验器为QIntValidato
- QString使用split处理大数据时的低效率问题
junziruyu53
qtQStringsplit
QFilefile(filepath1);if(!file.open(QIODevice::ReadOnly)){returndtre;}QTextStreamtxtRead(&file);QStringline=txtRead.readLine();QStringListlist=line.split(QRegExp("\\s+"));file.close();一直在使用QString的spli
- HTML学习7[重点]
乌鸦不像写字台
html学习html学习github
HTML表单form一、表单二、提交数据三、用户注册表单四、下拉列表支持多选五、file控件六、hidden控件七、readonly和disabled八、input控件的maxlength一、表单表单有什么用?收集用户信息;表单展现之后,用户填写表单,点击提交按钮提交数据给服务器。怎么画一个表单?使用form标签画表单。一个网页中可以有多个表单form。表单最终是需要提交数据给服务器,form标签
- 【Vue3源码】第六章 ref的原理 实现ref
顽皮宝
vue前端vue.js
【Vue3源码】第六章ref的原理实现ref上一章节我们实现了reactive和readonly嵌套对象转换功能,以及shallowReadonly和isProxy几个简单的API。这一章我们开始实现ref及其它配套的isRef、unRef和proxyRefs我们看下三行简单的代码consta=ref(1);effect(()=>{calls++;dummy=a.value;});a.value=
- qt自定义下拉菜单框
二氧化矽
qt
Qt自带的QCombBox下拉能够显示的东西有限,想添加其他的控件不太方便,所以就想自己定义一个,基本思路是,一个QLineEdit,一个QPushButton,一个QListWidget组成一个组合控件。过程:1、将QPushButton嵌入进QLineEdit中。_button->setText("...");_lineEdit->setReadOnly(true);_lineEdit->se
- Oracle只读表
zha_sir
Oracleoracle只读
Oracle只读表能阻止表上所有的DML操作(truncate/insert/update/delete)SQL>createtablet_zhasirasselect*fromdba_objectswhererownumaltertablet_zhasirreadonly;Tablealtered.--设置表为读写状态SQL>altertablet_zhasirreadwrite;Tableal
- WPF RelayCommand 含无参
Dorthyn
C#WPFwpf
引用usingSystem;usingSystem.Windows.Input;namespaceRelayCommand{publicclassRelayCommand:ICommand{privatereadonlyAction_execute;privatereadonlyFunc_canExecute;//////RaisedwhenRaiseCanExecuteChangediscall
- spring 中实现事务的几种方式
szc1767
springspringjava数据库
一、声明式事务通过Service层方法上添加Spring的@Transactional注解来完成常用配置参数名称功能描述readOnly该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)rollbackFor该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常
- shallowReactive 与 shallowRef, readonly 与 shallowReadonly
大鸡腿最好吃
vue3vue.js
shallowReactive:只处理了对象内最外层属性的响应式(也就是浅响应式)shallowRef:只处理了value的响应式,不进行对象的reactive处理什么时候用浅响应式呢?一般情况下使用ref和reactive即可如果有一个对象数据,结构比较深,但变化时只是外层属性变化===>shallowReactive如果有一个对象数据,后面会产生新的对象来替换===>shallowRefrea
- Vue3中的reactive,shallowReactive,ref,shallowRef;readonly,shallowReadonly; toRaw,markRaw简单介绍
会说法语的猪
vue3vue.js
reactive:深度劫持(深监视)shallowReactive:浅度劫持(浅监视)ref:深度劫持(深监视),做了reactive的处理shallowRef:不做监视readonly:只读属性的数据,深度只读conststate2=readonly(state)shallowReadonly:只读的数据,浅只读的toRaw:·作用:将一个由reactive生成的响应式对象转为普通对象·使用场景
- iOS编程解析URL
单线程Jack
#importNS_ASSUME_NONNULL_BEGIN/***URL解析类*/@interfaceURLHelper:NSObject/***scheme*/@property(strong,nonatomic,readonly)NSString*scheme;/***host*/@property(strong,nonatomic,readonly)NSString*host;/***pa
- vue3中shallowRe用法介绍
phpgolife
vue前端javascriptvue.js
shallowReactive、shallowRef和shallowReadonly是Vue3中CompositionAPI的一部分,它们用于创建响应式数据,但与普通的reactive、ref和readonly不同,它们创建的响应式数据是“浅层的”(shallow)。这意味着它们只会追踪对象本身属性(第一层)的响应性,而不会追踪对象内部嵌套属性的响应性。shallowRea
- Web前端Html的表单
任家伟
前端html
表单的关键字:form标签表示一个表单区域action=“后端地址”method=“提交数据方式:get/post”input单行输入框type=“text”文本name=“定义名称名字自定义”向后端提交的键readonly=“readonly”只读,不可修改,但是可以提交disabled=“disabled”禁用组件不可修改,不能提交type=“password”密码框type=“radio”单
- RN 生命周期
小如99
先给一波总结:Props属性相当于OC中的ReadOnly,只读属性!!state状态每个组件有一个系统的setState方法,用来改变状态,而且会刷新界面!调用Render()函数!!componentWillMount相当于OC中的ViewWillAppearRN的生命周期方法已经执行顺序如下:componentWillMount(){AlertIOS.alert('我要挂啦');}rende
- 在odoo中使用attrs的动态表单元素
StackSurfer
python
在Odoo中,attrs属性用于动态修改表单视图中字段的属性(如隐藏、只读或必填)基于其他字段的值。它主要用于视图XML中定义表单视图时。attrs属性采用一个字典格式,其中键是要修改的属性(如invisible、readonly、required),值是一个域表达式(domainexpression),用来决定何时修改这些属性。下面是一个使用attrs的示例,我们将创建一个简单的Odoo模块视图
- 【HarmonyOS Arkts笔记】http网络请求封装
PJF0715
HarmonyOS网络笔记http
common.tsexportdefaultclassCommonConstant{/***Thehostaddressoftheserver.*/staticreadonlySERVER:string='请求接口地址';/***Therequestsuccesscode.*/staticreadonlySUCCESS_CODE:number=200;/***Readtimeout.*/stati
- Qt应用软件【文件篇】读写文件技巧
编程小鱼酱
Qt应用软件300篇qt开发语言
文章目录简介按照偏移读文件按照偏移写文件Qt按行写文件Qt按行读文件注意事项指定文件编码格式UTF8转GBK简介Qt提供了丰富的API来处理文件读写操作,使得读写文件变得简单。按照偏移读文件QFilefile("example.txt");if(file.open(QIODevice::ReadOnly)){qint64offset=100;//定义偏移量if(file.seek(offset))
- PostgreSQL创建只读用户
dhiivgzni65686145
数据库
创建用户及指定密码:CREATEUSERreadonlyWITHENCRYPTEDPASSWORD'ropass';设置用户默认事务只读:alteruserreadonlysetdefault_transaction_read_only=on;赋予用户权限,查看public模式下所有表:GRANTUSAGEONSCHEMApublictoreadonly;ALTERDEFAULTPRIVILEGE
- macad.core解析exchange
table study
windows学习
1.exchangeusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingMacad.Core;namespaceMacad.Core{//交换器注册表publicstaticclassExchangeRegistry{//交换器字典staticreadonlyDictionary>_Exchangers=newDict
- 02Typescript接口和类型别名
一朵云有多重
Typescripttypescriptjavascript前端
1.接口使用场景:当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的。interfacePerson{name:string;age:number;say():void;hobby?:string;readonlyx:number;}语法规范1.使用interface关键字来声明接口2.属性类型后用;(分号)结尾3.所有属性都不能有实际值,只定义结构类
- .NET Core WebAPI中使用Log4net记录日志
Tigers996
.NET.netcorelog4net
一、安装NuGet包二、添加配置//log4net日志builder.Logging.AddLog4Net("CfgFile/log4net.config");三、配置log4net.config文件四、记录日志privatereadonlyILogger_logger;//////构造函数//////publicWeatherForecastController(ILoggerlogger){_
- AT24C02(I2C总线)通信的学习
OwnResponsibility
学习
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、存储器介绍二、AT24C02芯片二、I2C总线I2C电路规范I2C时序结构I2C数据帧AT24C02数据帧总结前言学习AT24C02(I2C总线)芯片一、存储器介绍RAM()存储速度较快,但容易丢失数据。ROM(ReadOnlyMemory)存储速度较慢,但掉电不丢失数据。在使用时需要两者结合先存入RAM再转存到ROM
- 【QT】QFile读取.txt文本文件时,中文乱码问题(已解决)
Wyn_
Qtqtc++QFile
目录0.背景1.修改方法0.背景项目读取一个【.txt】文本文件,显示到下拉框中,其中含有中文,在读取中文相关字段时会出现乱码,代码和显示如下.txt文本内容如下(显示到下拉框时,我做了分割处理):实际读取的是【中文test1】QFilefile(filePath);if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){returnfalse;}Q
- 【ant-design-vue】a-input、a-number、a-date在disabled时样式修改
Chx.zhang
vue.js前端ant-design
a-input、a-number、a-date在disabled时,颜色比较深,不宜查看。由于之前项目之前在对输入框禁用,不宜查看,故做此修改并记录。只是有一个疑问,为什么之气那项目的查看不用readOnly???不香吗?????/*覆盖ant-design-vue样式**/.ant-select-disabled.ant-select:not(.ant-select-customize-inpu
- 编写高效的代码,你应该了解Array、Memory、ReadOnlySequence
液态不合群
算法开发语言c语言
针对“缓冲区”编程是一个非常注重“性能”的地方,我们应该尽可能地避免武断地创建字节数组来存储读取的内容,这样不但会导致大量的字节拷贝,临时创建的字节数组还会带来GC压力。要正确、高效地读写缓冲内容,我们应该对几个我们可能熟悉的类型具有更深的认识。一、Array、ArraySegment、Span、Memory与String二、MemoryManager三、ReadOnlySequence四、创建“
- Vue3警告:Write operation failed: computed value is readonly
ydcgye_
前端javascript开发语言
前因:利用vuex存放公共属性,并在组件中利用computed赋值调用锁定问题来源:(这里使用setup语法糖,js语法)letisVisible=computed(()=>store.state.daiLog.isVisible)原因:使用简写方法,当表单修改isVisible的值时,就会调用set方法,而这里的computed属性是不允许修改的解决方案:letisVisible=compute
- 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发布消息