【问题标题】:Do I need to use a factory in order to inject a simple object in Jersey?我是否需要使用工厂才能在 Jersey 中注入一个简单的对象?
【发布时间】:2016-03-23 15:25:31
【问题描述】:

到目前为止,为了将 Foo 类型的对象注入 Bar,我执行以下操作。

要注入的类:

class Bar {
    @Inject
    Foo field;

    public Foo getField() { return field; }
}

代码实现工厂:

public class Foo implements Factory<Foo> {
    @Override
    public Foo provide() {
        return new Foo();
    }

    @Override
    public void dispose(Foo f) {
    }
}

主配置中的代码:

final ResourceConfig rc = new ResourceConfig()
                .packages("com.example")
                .register(
                        new AbstractBinder() {
                            @Override
                            protected void configure() {
                                bindFactory(new FooFactory()).to(Foo.class).in(Singleton.class);
                            }
                        })

我的问题是......在使用 hk2 进行依赖注入的 Jersey 2.0 中,无论如何都可以在不创建工厂类的情况下注入对象?

【问题讨论】:

    标签: java dependency-injection jersey hk2


    【解决方案1】:

    可以在没有FactoryInjectionResolver 的情况下使用AbstractBinder 进行注入绑定。

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

    在这种情况下,类 Foo 和 Bar 有空的构造函数。

    public class Bar {
        @Inject
        Foo field;
        public Foo getField() { return field; }
    }
    
    public class Foo {}
    

    现在您可以将 Bar 注入资源或其他 hk2 bean。

    【讨论】:

    • 如果类有一个带参数的构造函数呢?所有这些参数都需要@Inject 吗?
    • 不可能,您可以仅在字段上使用@Inject,或者您以这种方式绑定实例:bind(new Bar("test")).to(Bar.class);
    • 一般来说,对于更复杂的注射要求(例如辅助注射),您必须使用 InjectionResolver 或工厂。
    • 好吧,您可以在构造函数和方法上使用@Inject。如果你这样做了,那么构造函数的所有参数也必须是 hk2 服务,可以在 hk2 尝试构造对象时解析
    • 啊是的,当然...@Inject public AResource(Hk2Bean1 a, Hk2Bean2 b) {...}是可能的
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2023-03-25
    • 2012-01-06
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多