在Jersey 2.X中,功能由HK2实例化。我如何使用我还添加的工厂?

时间:2017-08-17 05:23:47

标签: jersey-2.0 hk2

在Jersey的奇怪,奇怪的依赖注入世界中,你可以包含AbstractBinder(但可能不仅仅是Binder)作为{{1}的返回值中的一个对象} Application方法。

然后getSingletons()可以在其AbstractBinder方法中调用各种bind()方法,但是没有其他JAX-RS实现可以保证调用 - 因此您可以链接接口的实现,它允许您在应用程序中从那一点开始执行依赖注入。也就是说,一旦你完成了这一点,那么你的资源类中的注入点将被你所绑定的实现“填充”。

(您也可以使用工厂类执行此操作,以便将特定工厂方法的返回值绑定到它实现的合同。)

好的,很好。

Jersey还允许您将实现configure()的{​​{1}}放入Class的{​​{1}}方法的返回值中。精细。这个Feature类将由HK2实例化,并对其进行精心记录! - 它的Application方法将在某个时刻被调用。此时,getClasses()可以通过调用Feature并将其交给任何想要注册的内容来注册其他一些内容。  (据推测,在HK2的configure(FeatureContext)机器之上,这是一个相当复杂的外观。)

无论如何,由于Feature是由HK2实例化的(请记住?),因此可以FeatureContext#register()DynamicConfiguration内容添加到其构造函数中,或者在类中的其他地方注入点。这很酷!然后HK2可以利用它所知道的所有服务来填补这些注入点。非常整洁。

啊,但问题是:此时HK2世界的状态是什么?可以将哪些服务注入到作为A JAX-RS的一部分实例化的Feature实现中@Inject的启动顺序?

如果您的Feature Application方法返回Application实施,该实施将getSingletons()范围内的AbstractBinder绑定到FooImplFoo方法中,Singleton - “注册”可以将其类包含在configure()的{​​{1}}方法的返回值中 - 然后注入{{1 }}吗

1 个答案:

答案 0 :(得分:1)

我认为让你的Foo接口绑定代理很重要,即:

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

然后依赖注入将对instatination顺序不敏感。