【问题标题】:Guice inject injector or generic provider somehowGuice 注入器或通用提供程序以某种方式
【发布时间】:2012-05-18 14:52:46
【问题描述】:

我需要有延迟加载逻辑来在我的班级中创建映射器。每个映射器都继承自Mapper<T> 接口。但是通过时间对象的工作,它可以使用多个映射器,具体取决于它处理的输入。

正如我所见,在课堂上注入注入器不是一个好方法,但我怎么能实现延迟加载不这样做呢?我不能使用Provider<Mapper>,因为提供者无法确定我当时需要哪个确切的映射器。

非常感谢。

【问题讨论】:

  • 您是否在问如何根据一些输入注入不同的 Mapper 子类实例?如果是这样,输入是动态的还是静态的?
  • 动态。问题是关于如何有可能创建映射器并且不在对象中注入注入器。如果不可能 - 那么我认为注入注射器将是解决方案

标签: java generics dependency-injection inversion-of-control guice


【解决方案1】:

这可能不是最好的解决方案,但它可能对你有用。

您可以实现一个允许您提供动态输入的 Provider。然后将该 Provider 注入到需要它们的类中,以便您可以动态创建所需的对象。

这是来自Provider JavaDoc的sn-p:

一个实现类可能总是选择注入一个Provider实例,而不是直接注入一个T。这可以让您访问多个实例、您希望安全地变异和丢弃的实例、超出范围的实例(例如,使用 @SessionScoped 对象中的 @RequestScoped 对象)或将延迟初始化的实例。

它可能如下所示。我个人认为将 Injector 注入到提供程序中很好,因为它是注入框架的一部分。目标是将 Injector 排除在您的应用程序代码之外,这当然可以。

public class FooProvider implements Provider<Foo>

    @Inject
    private Injector injector;

    private String input;

    public void setInput(String input){
        this.input = input;
    }

    @Override
    public Foo get(){
        if(input.equals("bar")){
            injector.getInstance(Bar.class); // Bar implements Foo
        }
        else{
            injector.getInstance(Baz.class; // Baz implements Foo
        }
    }
}

然后在别处……

public class Goo{

    @Inject
    Provider<Foo> fooProvider;

    public Foo goo(String input){
        fooProvider.setInput(input);
        return fooProvider.get();
    }
}

关键是确保每个提供程序实例在每个注入点都是唯一的,我认为这是默认情况下的。由于此提供程序具有可变状态,因此您不能在您的应用程序周围抛出它(并且可能在多线程环境中做错事),除非您打算这样做。那么你需要采取更多的预防措施。

【讨论】:

  • 感谢您的回答。但我认为如果这样做,我们仍然对注入器有依赖,但只用提供者包装。
  • 我的意思是你仍然让 Injector 远离你的应用程序代码。 Provider 的目的是增强 Injector 创建对象的方式。如果您不需要注入器来创建(在我的示例中)Bar 和 Baz,那么您不需要将其注入到 Provider 中。
  • 认为你是对的。但是在开发时,我试图将使用中的项目数量减少到最低限度(根据奥卡姆的剃刀想法)。
  • @JeremyHeiler 你怎么在Provider上调用setInput方法
  • @WojtekO。代码在FooProvider 上调用setInput。 OP 需要动态设置输入的能力,这就是这样做的原因,正如我在第二段中所解释的那样。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多