4

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

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

非常感谢。

4

1 回答 1

3

这可能不是最好的解决方案,但它可以为您工作。

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

这是Provider JavaDoc的一个片段:

实现类可能总是选择注入一个 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();
    }
}

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

于 2012-05-18T15:14:29.637 回答