# 监听函数
监听函数是实现机器人功能的重要部分,如果没有监听函数那么你的机器人就什么也做不了。
>[warning] 1.0-BETA版本后,所有的监听函数类都需要在类上标注`@Beans`注解,同时监听函数的实例机制也有所改变,不再是一个函数一个实例,而是取决于依赖注入功能。
<br>
## **监听函数的实现方式**
### 1\. 实现接口(不推荐)
>[danger] **※ 注 : 核心版本`1.3-BETA`之后已经移除了接口实现的方式。**
>[warning] 实现一个监听函数的第一个方法是实现已经根据接口文档定义好的接口。但是我并不推荐使用这种方式,因为使用接口的方式会使得你的代码很长,很不美观,参数的注入也并不是动态的,还会导致你的一个类中所能承载的同种类型的监听函数只能有一个。使用接口方式实现监听函数的方法已经标注了`@Deprecated`过时注解并有很大概率在后续版本中移除。
> 以下为可以实现的监听函数接口
* 事件相关
* EventFriendAddedListener 好友(已)添加事件
* EventGroupAdminListener 群管理员变动事件
* EventGroupMemberJoinListener 群成员增加事件
* EventGroupMemberReduceListener 群成员减少事件
* 消息相关
* MsgDisGroupListener 讨论组消息
* MsgGroupListener 群消息
* MsgPrivateListener 私信消息
* 请求相关
* RequestFriendListener 好友添加申请
* RequestGroupListener 群添加申请
<br/>
### **2\. 使用监听函数注解(推荐)**
>[success] 使用注解的方式与实现接口的方式相比,使用注解的方式就轻便了很多,功能性也更加强大。
> 注解方式主要用到了以下注解:
```
@Listen
@Filter
@Spare
@Constr
。。。(以文档章节为准)
```
什么!居然有这么多?看上去好麻烦!
别着急,上面这些注解中只有 **`@Listen`** 注解是必须的,其他的里面也只有 **`@Filter`** 是常用的。以下是对这些注解的含义与参数的解释。
<br>
**具体的注解使用方法请查看对应的子章节。**
<br>
## 简单的例子:
```java
@Beans
public class TestListener {
@Listen(MsgGetTypes.privateMsg)
public void testListen1(PrivateMsg msg, MsgSender sender) {
System.out.println("我收到了私信:" + msg);
// 返回一句:我收到了
sender.SENDER.sendPrivateMsg(msg.getQQ(), "我收到了");
}
}
```
<br>
## **监听函数的参数**
到这里,注解方式实现监听函数所用到的注解基本都介绍完毕了。这时候又出现了一个问题:参数怎么办?使用注解的话就没有接口来控制参数,我该怎么获取消息呢?
<br>
首先,对于每次监听到的消息、送信器以及CQ码工具类,会作为`动态参数`注入到方法参数中。
其次,在`依赖注入`功能的辅助下,所有作为`依赖`注入到框架内部的对象均作为参数自动注入。
也就是说,哪些类你想要,就写到参数中,只要我能够提供给你,就会自动注入进去。
值得一提的是,上述的`动态参数`不可以使用`依赖注入`功能的`@Depend`注解注入到**类字段**中,而**只能**在监听函数参数中使用。
<br>
<br>
## **监听函数的返回值**
从核心`1.4.1`版本开始,监听函数的返回值的含义变多了。关于监听函数具体的返回值含义,请查阅子章节 `成功判定与返回值`
- 前言
- 简单介绍
- 我该如何阅读文档
- 视频教程
- 安装与使用
- 开源协议
- 免责&捐助
- 注意事项
- 版本命名规则简介
- 主要功能版本历史
- 功能指引
- 通用API与功能
- 国际化语言
- 异常
- 消息监听
- @Listen
- @OnListen模板
- @Filter
- 消息参数截取
- @Spare
- @Constr
- @Ignore
- @ListenBreak
- @ListenBreakPlugin
- @ListenBody
- 监听响应
- 成功判定与返回值
- 监听上下文
- 动态参数
- 监听消息API
- 异步监听 @Async
- 限流监听 @Limit
- 自定义Http送信器
- 枚举与类型
- 送信器
- SENDER
- SETTER
- GETTER
- 返回值
- 其他位置
- 日志与日志拦截
- 异常处理
- 依赖注入
- 自定义依赖获取
- 批量依赖载入
- 注意事项
- 常量
- 定时任务
- 自定义过滤
- 拦截器
- 拦截器总定义
- 上下文对象总定义
- 监听消息拦截
- 送信器拦截
- 监听函数拦截
- CAT码
- CQ码
- CQCode
- CQ码工具类
- CQ扩展工具类
- AppendList拼接链
- 高级内容
- 阻断机制
- 截断机制
- 自定义枚举类型
- 枚举工厂
- byName注解
- 自定义注解
- 配置
- 文件配置
- 注解配置
- 参数配置
- 多配置
- 多账号
- 自定义账号管理器
- 小心!
- 核心版本与组件如何升级核心
- 核心版本迭代指南
- 核心
- 更新日志
- jar包与依赖
- 监听消息类结构图
- 快速启动
- 模组与扩展
- 模组开发
- 现有模组
- 通用模组-延时任务
- 通用模组-CQ码工具
- 转义器
- CQ码操作工具类
- CQ码模板-CodeTemplate
- CQ码载体-KQCode
- CQ码构建器
- MQ码工具类
- 通用模组-redis-bot管理器
- 通用模组-Debugger
- Debugger-common模块
- Debugger-server模块
- Debugger-client模块
- 通用模组-钉钉机器人
- 组件-Mirai(JVM)
- 快速开始(1.13+)
- springboot-starter
- 注意事项
- 配置
- 额外的内容
- 快速回复
- 额外监听
- CQ码解析
- 组件-酷Q(QQ)-CQ HTTP API(基本失效)
- 快速开始(推荐)
- 快速开始(1.7.x以下,不推荐)
- 快速开始(Springboot启动器)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 额外的内容
- 自定义额外监听
- CQ送信器
- 元事件
- 监听消息类结构图
- 组件-酷Q(QQ)-JCQ(失效)
- 快速开始
- 更新日志
- 额外的内容
- JCQ日志
- 配置
- 注意事项
- 监听消息类结构图
- 组件-酷Q(QQ)-HTTP TO CQ(失效)
- 快速开始(核心1.7.x及以下)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 监听消息类结构图
- 组件-酷Q(QQ)-LEMOC (失效)
- 快速开始(核心1.7.x及以下)
- 配置
- 注意事项
- 更新日志
- 监听消息类结构图
- Springboot快速启动器
- 常见问题汇总
- BUG反馈
- 更新计划总览