首页 > 解决方案 > HK2 代理与 javax.inject.Provider

问题描述

我有两个绑定到依赖注入器的单例服务(通过 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通常建议使用 using,因为它避免了这种急切的评估和循环依赖(尽管我尽量避免这些)。

但是让它成为代理呢?

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吗?

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

标签: dependency-injectionjerseyhk2

解决方案


这纯粹是一种观点,但出于您提到的大多数原因,我自己更喜欢代理。一般来说代理接口更好,因为这样会使用 JDK 代理,但只要您的 Bar 类遵循代理规则,您仍然可以。


推荐阅读