5

我正在尝试使用 Google Guice 进行一些后期绑定。

public class MyClassProvider implements Provider<MyClass>{
    private DependencyClass dep;
    private WebService webservice;

    @Inject
    MyClassProvider(DependencyClass dep, WebService webservice){
        this.dep = dep;
        this.webservice = webservice;
    }

    public MyClass get() {
        MyClass myclass = webservice.call(dep);
    }
}

我在模块中有一个绑定:

   bind(MyClass.class).toProvider(MyClassProvider.class).in(ServletScopes.REQUEST);

我有另一个类 ConsumerClass,它需要使用 MyClass。问题来了,因为 dep 直到某个点都为空,我将无法将 MyClass 注入 ConsumerClass,因此我注入了 Provider。

public class ConsumerClass {
    private MyClassProvider myClassProvider;

    @Inject
    public ConsumerClass(Provider<MyClass> myClassProvider){
       this.myClassProvider = myClassProvider;
    }

    ......

    public void myfunction() {
        // Here dep is initialized and become non-null here.

        // Then, I call
        MyClass myClass = myClassProvider.get();

    }
}

我遇到的问题是,当我将 MyClassProvider 注入 ConsumerClass 时,它试图创建 MyClassProvider 的实例,因为当时 dep 为空,它失败了。将其注释为 @Nullable 并不能解决我的问题,因为无论如何我都需要在提供程序的 get() 方法中使用 dep。

有什么方法可以让 Guice 仅在调用 get() 方法时创建提供程序实例?或者在这个问题上还有其他解决方法吗?

非常感谢。


杰夫:谢谢你的回复。

你的意思是我可以将我的代码更改为:

public class MyClassProvider implements Provider<MyClass>{
        private Provider<DependencyClass> depProvider;
        private WebService webservice;

        @Inject
        MyClassProvider(Provider<DependencyClass> depProvider, WebService webservice){
            this.depProvider = depProvider;
            this.webservice = webservice;
        }

        public MyClass get() {
            DependencyClass dep = depProvider.get(); 
            MyClass myclass = webservice.call(dep);
        }
    }
4

1 回答 1

3

替换DependencyClassProvider<DependencyClass>。Guice 不需要toProvider@Provides方法来访问 Guice 可以提供的任何类型的 Provider。

这种方式dep只需要在调用 MyProvider 时提供,而不是实例化。

于 2013-02-12T16:00:21.077 回答