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



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

然后,该AbstractBinder可以从其configure()方法中调用各种bind()方法,Jersey 可以保证调用这些方法,但没有其他 JAX-RS 实现可以调用这些方法,因此您可以将实现链接到接口,从而允许您从该点开始在应用程序中执行依赖关系注入的外观。 也就是说,一旦你这样做了,那么你的资源类中的注入点将被你绑定的实现"填充"。

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

好的,好的。

Jersey 还允许您放置一个Class,该将Feature实现到ApplicationgetClasses()方法的返回值中。 好。 这个Feature类将由 HK2 在幕后实例化——记下这一点!——它的configure(FeatureContext)方法将在某个时候被调用。 此时,Feature可以通过调用FeatureContext#register()并向其传递它想要注册的任何内容来注册一些额外的内容。 (据推测,这都是HK2DynamicConfiguration机器之上的一个相当复杂的门面。

无论如何,由于Feature是由 HK2 实例化的(还记得吗?(,因此您可以将内容@Inject到其构造函数中,或者在类中的其他地方具有注入点。 很酷! 然后HK2可以利用它所知道的所有服务来填补这些注入点。 非常整洁。

啊,但问题是:此时HK2世界的状态如何?哪些服务可以注入到作为 JAX-RSApplication启动序列的一部分实例化的Feature实现中?

如果你ApplicationgetSingletons()方法返回一个AbstractBinder实现,该实现将FooImpl绑定到Singletonconfigure()方法范围内的Foo,那么你的Feature(通过在ApplicationgetClasses()方法的返回值中包含其类来"注册"(然后注入Foo吗?

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

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

那么依赖注入将对 Instatination 顺序不敏感。

最新更新