如何使用Guice的注入器(Injector)?

12

我正在学习Guice,但我不太清楚如何使用Injector实例。最好在应用程序启动时创建Injector实例,并将其公开为单例?

那么我们总是必须使用Injector#getInstance(SomeClass.class)来获取放置了Guice的@Inject注解的类吗?


最好根本不要使用 Injector.getInstance() - millimoose
2
@millimoose 但是还有其他方法可以检索由Guice管理的类吗? - WelcomeTo
1
是的,在提问之前我已经阅读了它,但是带有@Inject注释字段的类必须使用Injector#getInstance(MyClass.class)进行检索。那么如果我有多个带有@Inject注释字段的类呢?我需要使用Injector#getInstance(ClassName.class)来初始化每个类。 - WelcomeTo
是的,我从不知道guice的类中调用由guice管理的类(因此它不起作用)。我测试了Injector.injectMembers(this)。据我所知,我需要在每个具有@Inject注释的类中调用此方法? - WelcomeTo
不行,只适用于那些不由Guice管理的对象。 - millimoose
显示剩余2条评论
1个回答

9
您不应该将注射器作为全局单例传递。您是否查看了:https://github.com/google/guice/wiki/GettingStarted?请注意,RealBillingService 不使用注射器获取 CreditCardProcessorTransactionLog 的实例。相反,在创建实例时,Guice 会为您处理所有这些内容。
如果您需要 Guice 创建许多相同类型的对象,请考虑使用 Provider 并注入该提供程序。

是的,我明白了。但是如果我有多个服务,例如RealBillingService,每个服务都有用于注入CreditCardProcessorTransactionLog对象的@Inject注释。因此,我需要为每个服务像RealBillingService一样使用Injector#getInstance。但是我想在不同的地方创建这些服务,所以我有两种选择:在每个地方创建Injector对象并使用Injector#getInstance来检索必要的服务,或者创建Injector实例一次并使其可访问(全局单例)到我需要它的所有地方。 - WelcomeTo
或者有一个第三个对象,它具有您两个服务的实例(都带有@Inject注释)。然后,您将使用Injector获取此第三个对象的单个实例。 - condit
实际上你很少看到injector。如果你正在使用JerseyGuice,例如,你可以配置你的模块然后框架会处理剩下的部分。 - condit
Jersey默认支持Guice吗?这意味着Jersey是由Guice管理的组件,因此我们不需要显式地使用Injector实例? - WelcomeTo
你是指在JEE容器上下文中的Jersey吗?也就是说,CDI(Guice)只能在容器管理的组件中使用,例如EJB、JAX-RS(Jersey)、JAX-WS等,而不需要显式地使用Injector#getInstance吗? - WelcomeTo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接