在泽西岛奇怪的依赖注入世界中,你可以包含一个AbstractBinder
(但可能不仅仅是一个Binder
(作为Application
getSingletons()
方法的返回值中的一个对象。
然后,该AbstractBinder
可以从其configure()
方法中调用各种bind()
方法,Jersey 可以保证调用这些方法,但没有其他 JAX-RS 实现可以调用这些方法,因此您可以将实现链接到接口,从而允许您从该点开始在应用程序中执行依赖关系注入的外观。 也就是说,一旦你这样做了,那么你的资源类中的注入点将被你绑定的实现"填充"。
(您也可以使用工厂类执行此操作,以便将特定工厂方法的返回值绑定到它实现的协定。
好的,好的。
Jersey 还允许您放置一个Class
,该将Feature
实现到Application
的getClasses()
方法的返回值中。 好。 这个Feature
类将由 HK2 在幕后实例化——记下这一点!——它的configure(FeatureContext)
方法将在某个时候被调用。 此时,Feature
可以通过调用FeatureContext#register()
并向其传递它想要注册的任何内容来注册一些额外的内容。 (据推测,这都是HK2DynamicConfiguration
机器之上的一个相当复杂的门面。
无论如何,由于Feature
是由 HK2 实例化的(还记得吗?(,因此您可以将内容@Inject
到其构造函数中,或者在类中的其他地方具有注入点。 很酷! 然后HK2可以利用它所知道的所有服务来填补这些注入点。 非常整洁。
啊,但问题是:此时HK2世界的状态如何?哪些服务可以注入到作为 JAX-RSApplication
启动序列的一部分实例化的Feature
实现中?
如果你Application
的getSingletons()
方法返回一个AbstractBinder
实现,该实现将FooImpl
绑定到Singleton
configure()
方法范围内的Foo
,那么你的Feature
(通过在Application
的getClasses()
方法的返回值中包含其类来"注册"(然后注入Foo
吗?
我认为代理您的Foo
接口绑定很重要,即:
new AbstractBinder() {
@Override
protected void configure() {
bind(Foo.class)
.proxy(true)
.to(FooImpl.class)
.in(Singleton.class);
}
}
那么依赖注入将对 Instatination 顺序不敏感。