Guice 以某种方式注入注射器或通用提供者



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

在我看来,这不是

在课堂上注入喷油器的好方法,但是我怎么能实现懒惰加载不这样做呢?我不能使用Provider<Mapper>因为提供程序没有选项来确定我当时需要哪个确切的映射器。

多谢。

这可能不是最好的解决方案,但它可能适合您。

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

以下是来自提供程序JavaDoc的代码片段:

实现类可能始终选择注入提供程序实例,而不是直接注入 T。这使您可以访问多个实例、您希望安全更改和丢弃的实例、超出范围的实例(例如,在@SessionScoped对象中使用@RequestScoped对象(或将延迟初始化的实例。

它可能看起来像下面这样。我个人认为将 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();
    }
}

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

最新更新