2017-08-17 37 views
0

在澤西島的奇怪,奇怪的依賴注入世界中,您可以包含一個AbstractBinder(但可能不只是一個Binder)作爲Application的方法的返回值中的一個對象。在Jersey 2.X中,一個功能由HK2實例化。我如何使用我也添加的工廠?

AbstractBinder可以調用各種bind()方法從configure()方法,其中新澤西州,但沒有其他JAX-RS實現中,是保證呼叫,因此你可以鏈接實現對接口,它可以讓你做的假象從這一點開始依賴注入在你的應用程序中。也就是說,一旦你這樣做了,那麼你的資源類中的注入點就會被你所綁定的實現「填充」。

(您也可以與工廠類做到這一點,讓你一個特定的工廠方法的返回值綁定到它實現合同。)

OK,挺好的。

Jersey還允許您將實施FeatureClass放入您的ApplicationgetClasses()方法的返回值中。精細。這個Feature類將由HK2在封面下實例化 - 請記住這一點! - 它的configure(FeatureContext)方法將在某個時刻被調用。在那一點上,Feature可能會通過調用FeatureContext#register()來註冊一些額外的東西,並將它交給任何想要註冊的東西。 (想必這畢竟是一個相當複雜的FAç ADE上HK2的DynamicConfiguration機器的頂部)

無論如何,因爲Feature由HK2(記住)實例,它遵循的是你可以@Inject東西到它的構造,或在課堂其他地方有注射點。這很酷!然後HK2可以利用它所知道的所有服務來填補這些注入點。井井有條。

啊,但問題是:此時HK2世界的狀況如何?什麼服務可以注入到Feature實現中,作爲JAX-RS Application的啓動序列的一部分實例化?

如果您ApplicationgetSingletons()方法返回一個AbstractBinder實現,在其configure()方法結合一個FooImplFooSingleton範圍,可以在Feature - ‘註冊’通過在您Application的返回值及一流的getClasses()方法 - 然後注入Foo

+0

最後幾句話很混亂。也許一些代碼顯示什麼在工作,哪些不工作,以及你期望的工作將會有所幫助。 –

+0

你說得很對。我會刪除它們。粗體部分是我的主要問題。回顧一下:似乎在'AbstractBinder'中綁定的項目不可用於注入到「特徵」中。有什麼能說明這種行爲應該是什麼?在'AbstractBinder'實現''configure()'方法被調用之前'Feature'是否被實例化? –

+0

我想它應該工作。我會測試它並看看。 –

回答

1

我覺得有你Foo接口綁定代理是很重要的,即:

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

那麼依賴注入將是不敏感的instatination秩序。

相關問題