# 监听函数 监听函数是实现机器人功能的重要部分,如果没有监听函数那么你的机器人就什么也做不了。 >[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`版本开始,监听函数的返回值的含义变多了。关于监听函数具体的返回值含义,请查阅子章节 `成功判定与返回值`