2012-03-03 460 views
6

我想構建自己的基於Java註釋的自定義DI框架,我需要一個小小的方向開始。我知道使用諸如guice或spring之類的許多精彩框架中的一個會容易得多,但爲了我自己的好奇心,我想構建自己的框架。依賴注入與註解

我對註釋不是很熟悉,所以我在查找資源時遇到了一些問題,並且非常感謝某人解釋了我需要採取的一些步驟來開始。

如前所述,id喜歡採取工廠方法,並以某種方式將我的getter標記爲@Resource或@Injectable類型註釋,然後在我的業務類中可以使用@Inject註釋設置我的變量依賴項,資源自動可用。

有沒有人有任何資源可以傳遞,以幫助我理解基於註釋標記方法的過程,然後從基於註釋的單獨類中檢索值。我需要一個小小的方向,讓我開始。當然,一旦我走了,我會很高興在這裏發佈一些代碼示例,爲了其他人今後的閱讀。

編輯

我使用的資源放在了一起:

Java Reflection: Annotations

How to find annotations in a given package: Stack Overflow ?

Scanning Annotations at Runtime

我還沒有真正完成還沒有寫這個,但基本任務李ST將是如下(的人誰可能有興趣做,今後類似的東西)

  1. 在類運行時掃描所有@Inject領域,並得到對象類型。

  2. 對註釋方法@InjectableResource掃描所有類(或只是一個特定的類包(我還沒有確定 )))。

  3. 循環所有帶註釋的方法,並找到返回我要查找的對象類型的 方法。

  4. 運行該方法並獲得依賴關係。

注意到在掃描所有類時我將使用一個名爲Javassist的庫也會很有幫助。基本上,這樣做可以讓我在不實際加載類的情況下讀取每個類的字節碼信息。所以我可以讀取註釋字符串而不會產生嚴重的內存問題。

+0

可以與標準甲骨文註釋步道】開始(http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html)。您需要一些方法來掃描整個類路徑中的資源,一種方式是使用像[Google Reflections](http://code.google.com/p/reflections/)這樣的工具。最後,您將需要一些操作類的方法,例如[Javassist](http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/)。 – Perception 2012-03-03 17:18:10

回答

0

有趣的是,你想建立自己的。我愛谷歌Guice - 它使代碼如此優雅和簡單。

我已經使用this guide之前我發現它對於瞭解註釋以及如何將它們從類和方法中拉出來非常有用。

您將不得不使用@interface定義您自己的註釋。那麼你將不得不定義一些類來進行綁定,例如你可以在這個具體的類中看到一個接口綁定。最後,您需要一些邏輯來將其完全拉回,例如遍歷每個類,找到每個註釋,然後找到合適的綁定。

考慮通過Reflections和singletons進行懶惰實例化等操作。例如,Guice允許你使用單例,所以你只能使用具體類的一個實例,或者你可以每次綁定一個新的版本。

祝你好運!

+0

迄今爲止的重要建議。您鏈接的資源很有幫助。任何有關如何實際綁定一個方法(一個創建資源的getter,在我的案例中)到註釋的見解?我得到了如何創建自定義註釋並在該註釋中設置訪問變量,但是如何讓@Inject指向工廠類和特定方法? – ryandlf 2012-03-03 17:27:30

+0

我還沒有構建自己的依賴注入框架,所以我的方法只是去了解Guice如何實現它。您將需要一個綁定方法,它接受接口,註釋和具體類。 Guice這樣做的方法是創建一個AbstractModule,它由定義所有綁定的用戶定義的具體模塊實例化。請參閱此處:http://code.google.com/p/google-guice/wiki/BindingAnnotations – christophmccann 2012-03-03 17:32:15