2013-09-05 163 views
2

我是技術主管Agorava,這是一個幫助消費社交網絡數據的框架。是否可以在Dagger和CDI之間共享JSR 330代碼?

今天Agorava是建立在CDI以緩解其在Java EE中堆棧使用,但我們希望爲用戶提供匕首的實現有一個輕量級的解決方案爲Android工作。

我的問題是:我們可以分享CDI和匕首實現之間共同JSR 330標準的代碼?換句話說,是否有可能與匕首在罐子軸承JSR 330註釋和源代碼延伸或在一個特定匕首罐使用此代碼(與@Provides@Modules等匕首特定項目)已編譯的代碼?

如果答案是否定的是沒有任何問題的編譯我共同JSR 330罐子匕首編譯器,在我的CDI實現中使用它?更確切地說,@Inject,限定符和其他JSR 330具體細節在運行時仍然可用,並且這些註釋代碼的類將不會受到Dagger編譯器的影響嗎?最後在Dagger生成的代碼(classname,annotation)上是否有一種跟蹤器允許CDI檢測並忽略它?

+0

Dagger只能使用基於構造函數的注入,所以如果不這樣做,你的代碼需要重寫。 –

回答

5

您可以共享匕首和任何其他JSR-330實現之間的客戶端代碼,只要您的代碼不執行不與匕首兼容的行爲。例如,Dagger 1.0不支持方法注入。 Dagger 2.0使用組件接口而不是注入器,所以你的代碼將不必關心它。

@注入和其他JSR-330的API元素仍然會出現在運行時。 Dagger在運行時不會訪問它們,在編譯時創建生成的代碼以在運行時解釋這些註釋。但是對於任何JSR-330應用程序,這些類仍然是符合JSR-330標準的注入類。

可能存在的問題是Dagger會生成這些額外的類,並且您必須對該jar進行後處理,或者重新配置您的構建系統以便去除生成的代碼並將它們移動到補充jar 。但是這是一個構建系統配置問題,只要生成的代碼在運行時可以在使用匕首的應用程序中使用,匕首對它就是不可知的。

一個構建時間選項是使用-proc:none運行編譯器,而在第二個配置中使用-proc:only,並將後者的輸出管道輸送到另一個輸出文件夾,然後將其打開。這可以在maven中通過執行不同的maven-compiler-plugin來完成。匕首生成的類應該都具有@Generated(即將推出),但也都是從dagger.internal.ModuleAdapter,dagger.internal.Binding或dagger.internal.StaticInjection下降的。這些的子類都可以通過非匕首框架安全地忽略。事實上,他們可以被保護起來。

+0

謝謝@ChristianGruber。從你的回答中,我明白我的第一個問題是'不'作爲答案;)。無論如何,在另一個工件中生成生成的代碼是一個好主意。使用Maven也許我可以用分類器創建另一個版本的JSR 330 API。你怎麼看? –

+0

我認爲答案不是「否」 - 它是「如果你不使用默認方式使用maven,你可以。匕首隻是使用註釋處理器。您可以在不使用處理器的情況下編譯該源代碼,並明確使用源代碼,並且可以創建一個完全獨立的工件,如果您願意,可以在獨立的執行階段生成匕首代碼。這完全是關於你的構建系統和配置,真的。符合JSR-330的代碼就是源代碼。用它做什麼適合你的項目。:) –

+0

奇怪的是澄清一年半後,但我得到了關於這個問題再次通知,所以注意到它。 :) –

相關問題