HK2代理vs javax.inject.Provider

时间:2018-10-17 22:12:41

标签: dependency-injection jersey hk2

我有两个单例服务绑定到依赖注入程序(通过Jersey):

ResourceConfig.register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(Foo.class)
            .to(Foo.class)
            .in(Singleton.class);
        bind(Bar.class)
            .to(Bar.class)
            .in(Singleton.class);
    }
});

Foo使用Bar,所以我可以简单地执行以下操作:

public class Foo {
    @javax.inject.Inject private Bar bar;
}

如果Foo仅很少使用Bar,那么我可以推迟其构造:

public class Foo {
    @javax.inject.Inject private javax.inject.Provider<Bar> bar;
}

我还读到,一般建议使用Provider,因为这样可以避免这种急切的求值和循环依赖(尽管我还是设法避免这种情况)。

但是如何使其成为代理呢?:

ResourceConfig.register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(Foo.class)
            .to(Foo.class)
            .in(Singleton.class)
            .proxy(true)
            .proxyForSameScope(true);
        bind(Bar.class)
            .to(Bar.class)
            .in(Singleton.class)
            .proxy(true)
            .proxyForSameScope(true);
    }
});

我是新来的注射者,所以不确定历史。对于两个不同的框架,它们实际上是否是相同的概念?

代理使代码看起来更好,并将关注点推送给服务的创建者,而不是服务的用户(这可能是可取的,也可能是不希望的)。与Provider相比,这有什么不利之处吗?

请注意,这里唯一考虑的是单例服务。

1 个答案:

答案 0 :(得分:0)

这纯粹是一种意见,但是由于您提到的大多数原因,我本人还是希望代理人。通常,最好使用代理接口,因为这样可以使用JDK代理,但是只要您的Bar类遵循代理规则,您还是可以的。