Java 将guice创建的对象注入到其他对象中

Java 将guice创建的对象注入到其他对象中,java,guice,modularity,discord-jda,Java,Guice,Modularity,Discord Jda,我已经为我的项目创建了一个模块化系统,它使用Guice进行依赖注入。这些模块是抽象模块类的子类,由反射库索引。这些模块还注入了配置类和管理器类等字段。每个模块都可以分配监听器、命令或计时器,这些监听器、命令或计时器可以通过注释创建(模块在注释参数中指定)。这些对象也通过反射进行索引,并加载模块 我希望能够使用Guice将模块注入监听器、命令、计时器或其他模块,而无需为我创建的每个模块创建绑定。例如: 模块: 公共类模块扩展模块{ @凌驾 public void onLoad(){ //加载模块

我已经为我的项目创建了一个模块化系统,它使用Guice进行依赖注入。这些模块是抽象
模块
类的子类,由反射库索引。这些模块还注入了
配置
类和
管理器
类等字段。每个模块都可以分配监听器、命令或计时器,这些监听器、命令或计时器可以通过注释创建(模块在注释参数中指定)。这些对象也通过反射进行索引,并加载模块

我希望能够使用Guice将模块注入监听器、命令、计时器或其他模块,而无需为我创建的每个模块创建绑定。例如:

模块:

公共类模块扩展模块{
@凌驾
public void onLoad(){
//加载模块
}
}
听众:

@Listener(module=RandomModule.class)//用于索引反射的注释
公共类RandomListener扩展ListenerAdapter{//ListenerAdapter是我正在使用的库中的一个类
@注入
private RandomModule RandomModule;//以某种方式注入模块
//其余的听众。。。
}
模块在启动时由ModuleLoader类加载,模块还可以依赖于另一个模块,以确保这些模块在依赖模块之前加载。可以使用
@Dependency
@Dependency
注释设置相关性

模块加载程序:

公共类ModuleLoader{
专用最终注射器;
公共模块阅读器(管理器){
this.injector=Guice.createInjector(新的默认模块(管理器));
}
公共空荷载(){
//按依赖项排序发生在这里
for(类timerClass:reflections.getTypesAnnotatedWith(Timer.Class)){
Timer annotation=timerClass.getAnnotation(Timer.class);
如果(annotation.module()!=moduleClass | | annotation.phase()!=modulebase.LOAD)继续;
如果(!TimerTask.class.isAssignableFrom(timerClass)){
抛出新的IllegalStateException(“Timer”+timerClass+“具有计时器注释,但不扩展TimerTask”);
}
注入器。注入器成员(timerClass);
timer.schedule((TimerTask)injector.getInstance(timerClass),annotation.delay(),annotation.interval());
}
注入器。注入器成员(模块类);
module.onLoad();
}
}
publicvoidenable(jdajda){//JDA也是我正在使用的库中的一个类
CommandHandler.Builder handlerBuilder=新建CommandHandler.Builder();
for(Class commandClass:reflections.getTypesAnnotatedWith(Command.Class)){
Command annotation=commandClass.getAnnotation(Command.class);
如果(annotation.module()!=moduleClass)继续;
injector.injectMembers(commandClass);
addCommand(injector.getInstance(commandClass));
}
//注册侦听器
for(类listenerClass:reflections.getTypesAnnotatedWith(Listener.Class)){
Listener annotation=listenerClass.getAnnotation(Listener.class);
如果(annotation.module()!=moduleClass)继续;
如果(!ListenerAdapter.class.isAssignableFrom(listenerClass)){
抛出新的IllegalStateException(“侦听器”+listenerClass+“具有侦听器注释,但不扩展ListenerAdapter”);
}
injector.injectMembers(listenerClass);
addEventListener(injector.getInstance(listenerClass));
}
//运行计时器
for(类timerClass:reflections.getTypesAnnotatedWith(Timer.Class)){
Timer annotation=timerClass.getAnnotation(Timer.class);
如果(annotation.module()!=moduleClass | | annotation.phase()!=modulebase.ENABLE)继续;
如果(!TimerTask.class.isAssignableFrom(timerClass)){
抛出新的IllegalStateException(“Timer”+timerClass+“具有计时器注释,但不扩展TimerTask”);
}
注入器。注入器成员(timerClass);
timer.schedule((TimerTask)injector.getInstance(timerClass),annotation.delay(),annotation.interval());
}
Module=modules.get(moduleClass);
module.onEnable();
}
this.commandHandler=handlerBuilder.build();
}
}
我还有一个DefaultModule类,它是一个GUI模块,包含我需要的一些绑定

默认模块:

公共类DefaultModule扩展了AbstractModule{
私人最终经理;
公共默认模块(管理器){
this.manager=经理;
}
@凌驾
受保护的void configure(){
bind(JDA.class).toProvider(botManager::getJda).in(Scopes.SINGLETON);//库中的另一个类
绑定(Manager.class).toInstance(Manager);
bind(Configuration.class).toProvider(botManager::getConfiguration).in(Scopes.SINGLETON);//包含数据库凭据等的自定义配置类。
bind(Database.class).toProvider(()->manager.getModuleLoader().getModule(DatabaseModule.class).getDatabase()).in(Scopes.SINGLETON);//和DatabaseModule中的一个数据库类。这很好,但我不想对我创建的每个模块都这样做。
bindListener(Matchers.any(),新的Slf4JTypeListener());
}
}
我是Guice的新手,因此任何帮助都将不胜感激!如果您需要更多信息,或者您还有其他问题,请告诉我