如何注射喷油器?

2022-09-01 10:38:35

情况:我需要在某些惰性依赖关系实例化,所以我作为构造函数参数传递给class。FooClassInjector

private final Injector m_injector;
    
public FooClass(@Named("FooInjector") Injector injector) {
    m_injector = injector;
}

但是 guice 不允许绑定核心类(注入器、模块等)。解决方案是什么?


答案 1

您不应直接使用 。宁愿通过代替。另外,您应该在使用的地方注入提供程序。InjectorProvider<FooClass>FooClass

private final Provider<FooClass> provider;

@Inject
public ClassWhereFooIsUsed(Provider<FooClass> provider) {
    this.provider = provider;
}

.... somewhere else
FooClass f = provider.get(); // This is lazy

答案 2

正如其他人已经回答的那样,您可以简单地使用,因为Guice定义了绑定本身。@Inject Injector

通常,你的应用中只需要一个,静态变量是一种比注入它更简单的存储和访问单一实例的方法。在我们的Web应用程序中,我们使用stripes-guicer,并在需要时从其静态方法中获取(例如,在我们的Hibernate拦截器中)。InjectorInjectorGuiceInjectorFactory.getInjector()

我对“你不应该直接使用In injector”的建议感到有些困惑。否则我如何获得注入的实例,除非通过调用 或 ?没有办法。是的,您可以定义 Provider 方法,但除非在某个地方使用注入器,否则永远不会调用它们。是的,有些模块像ServletModule一样使用为您服务;你必须自己创造,但你可以把它留到之后。injector.getInstance()injector.injectMembers()InjectorInjectorServletModule

因此,在某些情况下,您可以避免直接使用,但这并不意味着您“不应该”使用它。如果您单独使用Guice而没有任何可选模块,那么您“应该”到处使用Guice,因为没有其他方法可以触发注入。(我认为那些整天在框架中编写代码的开发人员有时会忘记有些人实际上实例化了自己的对象。InjectorInjector


推荐