gpt4 book ai didi

dependency-injection - Guice 的实例方法

转载 作者:行者123 更新时间:2023-12-04 08:23:21 25 4
gpt4 key购买 nike

我想为其中一个组件使用 Guice 的静态实例方法(非托管 bean 应该能够访问此类)。我创造了这样的东西:

public class LookupService {

@Inject
private static Provider<Injector> injector = null;

private final ILookup<IWS> lookup;

@Inject
public LookupService(ILookup<IWS> lookup) {
this.lookup = lookup;
}

public static LookupService instance() {
return injector.get().getInstance(LookupService.class);
}

public <T extends IWS> T lookup(Class<T> localInterface) {
return lookup.lookup(localInterface);
}

}

你觉得这个设计怎么样?对此还有其他想法吗? (从非托管对象访问托管 bean)

最佳答案

基本上,您正在寻找的模式称为“请求静态注入(inject)”,并且有一个 Binder method dedicated to it .一旦你把它写下来,你的代码看起来很像 this example from the Guice docs .

public class MainModule extends AbstractModule {
@Override public void configure() {
requestStaticInjection(LookupService.class);
}
}

public class LookupService {

/** This will be set as soon as the injector is created. */
@Inject
static Provider<LookupService> provider = null;

private final ILookup<IWS> lookup;

@Inject
public LookupService(ILookup<IWS> lookup) {
this.lookup = lookup;
}

public static LookupService instance() {
return provider.get();
}

public <T extends IWS> T lookup(Class<T> localInterface) {
return lookup.lookup(localInterface);
}
}

几点注意事项:
  • 虽然您仍然可以将字段设置为 private ,请记住,这意味着如果没有 Guice 的私有(private)字段访问魔法,您将无法在测试(或将来的非 Guice 使用)中设置它。使用注入(inject)字段时,我们经常将它们设为包私有(private),然后将测试放在同一个包中。
  • 静态注入(inject)通常被视为仅在迁移到 Guice 或使用无法更改的其他代码时才认可的东西。如果可能,尽量避免全局状态——即使这意味着使 FooBean仅数据并创建注入(inject) FooBeanService .
  • 即使您可以注入(inject) Injector无论你想在哪里,如果你只注入(inject)一个 Provider<LookupService>,你可能会发现更容易测试。反而。只注入(inject) Injector如果在运行时之前你不知道你需要什么类型——例如,如果你实现了 LookupService.lookup(...)使用 Injector通过将类文字传递给注入(inject)器以获取实例。
  • 其实从这里就不好说了,但是ILookup似乎很像 Service Locator pattern ,它解决了 Guice 通过依赖注入(inject)解决的确切问题类型!如果是这种情况,您不妨重写 ILookup 以使用 Guice:只需删除对 LookupService.instance().lookup(Foo.class) 的调用即可。而是创建一对匹配的 @Inject static Provider<Foo> fooProviderrequestStaticInjection(FooUser.class) .

  • 希望有帮助!

    关于dependency-injection - Guice 的实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13136051/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com