当前位置: 首页 > 知识库问答 >
问题:

Guice:如何绑定已绑定对象动态获取的类?

谢正初
2023-03-14

我正在使用Guice开发一个小型web框架。我有一个Router对象,一旦初始化,它就会公开一个getControllerClasses()方法。我必须循环所有这些动态返回的类,以使用Guice绑定它们。

我绑定路由器:

bind(IRouter.class).to(Router.class);

但是,我如何在一个模块中获得绑定的路由器实例,以便也可以绑定其getControllerClasses()方法返回的类?

我能够在模块中获取路由器实例的唯一方法是,将该实例绑定到第一个模块中,然后将其注入到第二个模块中,在setter上使用@Inject:

模块一

bind(IRouter.class).to(Router.class);

Module2 module2 = Module2();
requestInjection(module2);
install(module2); 

单元2

@Inject
public void setRouter(IRouter router)
{
    Set<Class<?>> controllerClasses = router.getControllerClasses();
    for(Class<?> controllerClass : controllerClasses)
    {
        bind(controllerClass);
    }
}

方法被调用,路由器实例被很好地初始化,但是控制器类的绑定失败了!在Guice生命周期的这一步,module2的绑定器实例似乎是NULL。

如何绑定动态获取的类,这些类是由已经绑定的对象返回的?

共有1个答案

公西翼
2023-03-14

此时绑定器为空,因为Guice在调用configure()之前设置绑定器。除了Guice调用模块的configure()方法外,没有绑定器。请记住,模块只是一个配置文件,它配置了创建喷油器时喷油器的行为方式。

requestInjection的行为与您认为的不同——也就是说,它不会立即绑定您传入的实例的字段。相反,你告诉它一旦有人创建了注入器,就立即注入字段和方法。在创建注入器之前,不会向传递的实例中注入任何内容。

如果您的路由器没有需要Guice的依赖项,那么只需创建一个新路由器(),并将其作为构造函数参数传递到您的模块中。然后,您可以在控制类中循环并绑定它们,还可以bind(Router.class)。toInstance(我的路由器)

然而,如果你的路由器确实依赖于其他模块,那么你可以使用子注入器。首先,创建一个注入器,从中取出一个路由器实例,然后将该路由器实例传递给另一个绑定其控制类的模块。突然,你会有一个模块(我们称之为controllingClassesModule),你可以执行以下操作:

newInjector = originalInjector.createChildInjector(controllingClassesModule);

然后,您的newInjector将从您的originalInjector以及路由器指定的所有控制类继承绑定。

希望有帮助!

 类似资料:
  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 静态绑定还是动态绑定? 这显示了什么样的多态性?

  • 起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。

  • 可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定

  • 我有以下代码: 生日属性的类型为java.time。LocalDate,并且属于类Person。因为我使用JPA,所以我不想使用JavaFX属性。上述代码无法编译。编译器的错误消息是: 我该如何解决这个问题? 更新:我的个人类具有以下代码: 控制器类:

  • 我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。