# @Listen >[info] @Listen是最主要的注解,没有此注解就无法构成一个监听函数。 > 提供`byName`注解:`@Listen.byName(...)` <br> ## 参数 ```java /** * 监听器所监听的类型, 可以监听多个类型 * 方法上的参数将会覆盖类上的参数 */ MsgGetTypes[] value(); /** * 假如出现了多个监听器处理同一个消息,使用此参数对其进行排序,默认值为1 * 核心版本1.6.3后默认值修改为100 */ int sort() default 1; /** * 相当于一个ID,此参数为空的时候会自动根据包、类、方法名、参数列表生成一个唯一ID */ String name() default ""; ``` 其中,`value`为一个`MsgGetTypes`类型的数组(`MsgGetTypes`为枚举类型,详情请查看枚举相关章节),定义了这个函数要监听的消息类型。 而`sort`参数则会在消息触发多个监听函数的时候,对他们的执行顺序进行排序。排序规则为JDK默认的由小到大排序。 此注解可以使用在类上,也可以使用在方法上。当一个方法所在的类与此方法本身都存在此注解的时候,优先使用类上的注解。 使用举例: ```java //这是一个监听私信消息的监听函数 @Listen(value = MsgGetTypes.privateMsg, sort = 0) public void listen1(PrivateMsg privateMsg, MsgSender sender){ // TODO some... } ``` ## 与依赖注入的整合 所有的`@Listen`注解中,默认"继承"了`@Beans(single = false)` 也就是说所有的监听类,如果不手动指定`@Beans`注解的话,默认是**非单例**的。 我很清楚这样会存在严重的效率问题,所以会在后续版本修正为默认**单例**。 至于为什么不在一开始就默认单例,嘛总是有原因的啦。 >[success] 核心 `1.5.0` 之后 `@Listen` 恢复为默认单例模式。