Java 使用pico容器设置多个装饰器

Java 使用pico容器设置多个装饰器,java,dependency-injection,adornerdecorator,picocontainer,Java,Dependency Injection,Adornerdecorator,Picocontainer,我一直在使用java中的pico容器为我设计的minecraft插件框架进行DI 插件具有在接口中定义的事件侦听器方法,每个接口一个方法 如果一个特定的类在玩家加入和离开服务器时需要事件,它将实现两个特定的接口;在本例中,IPLAYERLOGINVENT和IPlayerQuitEvent 然后在框架中有一个类,它将每种类型的事件接口作为构造函数注入的参数 这个容器类用@Listener标记,以便craftbukkit服务器软件调用它 包装器类使用特定于框架的类包装Bukkit发送的数据,至少在理

我一直在使用java中的pico容器为我设计的minecraft插件框架进行DI

插件具有在接口中定义的事件侦听器方法,每个接口一个方法

如果一个特定的类在玩家加入和离开服务器时需要事件,它将实现两个特定的接口;在本例中,IPLAYERLOGINVENT和IPlayerQuitEvent

然后在框架中有一个类,它将每种类型的事件接口作为构造函数注入的参数

这个容器类用@Listener标记,以便craftbukkit服务器软件调用它

包装器类使用特定于框架的类包装Bukkit发送的数据,至少在理论上可以编写与服务器无关的插件

小例子:

插件AwesomePlugin有一个类PlayerHandler,它实现IPlayerLoginEvent和IPlayerQuitEvent。然后,框架需要构造每个类“PlayerLogin”和“PlayerQuit”的实例,并将PlayerHandler作为构造函数参数传入。 PlayerLogin和PlayerQuit实例将依次作为事件侦听器注册到CraftBukkit

目前使用pico实现这一点的方式如下所示:


这段代码看起来确实很糟糕,我还没有找到一个更优雅的解决方案来解决这个问题,所以我现在请求您的指导:)

好吧,我不太理解您的问题,但我可以解释一些pico事件模式

首先,事件是以容器为中心的,您不能仅仅使用pico来连接事件。 每个事件使用者都被添加到容器中。每个使用者必须实现至少一个方法来获取事件obj。您可以有一个传递了泛型事件类的接口,也可以有多个用于不同事件类型的接口

因此,容器中有一个使用者列表(或多个事件类型的多个列表),您可以将使用者列表注入到某个事件广播对象中(显然,每个容器创建一次,广播者从某处接收事件,然后只是迭代列表并调用相关的事件处理程序方法)或只是进行容器自定义生命周期调用(可以随时完成并触发运行时添加的使用者,调用作业由容器本身完成)

有时,您甚至可能希望为每个事件创建新的事件容器,添加事件obj和所有相关使用者


华夫格框架包含了pico容器杂耍、事件处理等方面最好的例子。

我建议添加更多关于您的体系结构的信息;如果不深入挖掘代码,就很难了解正在发生的事情。稍后我会更深入地阅读您的答案,因为我没有立即了解,但现在,这里有一些额外的信息格式化:CraftBukkit服务器有一个我调用的方法来注册事件监听器。这些需要用@EventHandler标记,并且有一些方法以特定事件类型作为参数。我不想在一个不使用的插件中创建事件监听器,因此我编写了映射代码,它创建了所需的监听器..I明天我将回到这个话题,现在我需要睡眠。好的,在考虑了一段时间后,我想我理解了你的意思,它听起来像一个好的系统。不幸的是,它不能完全解决我的问题。出于性能原因,我不希望为框架编写的每个插件都侦听所有服务器事件。如果注册实现一个接口的多个组件,然后获取该接口的所有实现的实例,忽略缺少依赖项的实例,这将很好地解决我的问题。'缺少DEP'是什么意思?您可以使用不同的接口拆分事件流,或者只使用不同的方法而不使用任何接口(基于反射的生命周期、pico功能)或者,您可以为事件侦听器提供一个空的标记接口,然后使用您自己的基于反射的查找来传递事件。实际上,有很多选项。我的意思是,如果我注册一个类,该类将某些内容作为构造函数参数,但我没有注册实现该依赖关系的内容,我不希望pico tro尝试初始化该类。。它无法做到这一点。我的类上有自定义事件接口,但我需要bukkit事件处理程序来路由事件。但是,我不想侦听比需要更多的事件。感谢您的输入,我现在找到了一个更好的策略,这要归功于它。对于任何好奇的人,代码仍然在github上。