在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
绑定到FooImpl
在Foo
方法中,Singleton
- “注册”可以将其类包含在configure()
的{{1}}方法的返回值中 - 然后注入{{1 }}吗
答案 0 :(得分:1)
我认为让你的Foo
接口绑定代理很重要,即:
new AbstractBinder() {
@Override
protected void configure() {
bind(Foo.class)
.proxy(true)
.to(FooImpl.class)
.in(Singleton.class);
}
}
然后依赖注入将对instatination顺序不敏感。