Guice筆記_補充

 1、關於標註綁定,如若不是屬性,是方法上的注入,如下適用標註

 

 

 

2、隱式綁定,如果缺少顯示綁定(即沒有寫任何binder),Guice會試圖注入並創建一個所依賴的類的新實例,如果依賴於一個接口,Guice會尋找指向具體實現的@ImplementedBy標註,如果是依賴的是一個類,那就實例化此類。

 

3、定製Provide。

 

有時候需要手工創建自己的對象,而不是讓Guice創建他們,比如,一個來自第三方的實現類需要注入,但我們不能修改源碼,不能添加@Inject標註,在這裏就需要 自己定製Provider,手工創建對象。

 

例子:與JNDI集成,我們需要綁定從JNDI得到的對象。

 

我們可以使用定製的JndiProvider來將DataSource綁定到來自JNDI的一個對象上。

 

 

4、綁定的作用域

 

缺省情況下,Guice爲每次注入創建一個新的對象,即“無作用域”

可以在配置綁定時指明作用域

 

 

創建作用域標註

 

標註必須:

有一個 @Retention(RUNTIME) 標註,從而使我們可以在運行時看到該標註。 有一個 @Target({TYPE}) 標註。作用域標註只用於實現類。 有一個 @ScopeAnnotation 元標註。一個類只能使用一個此類標註。

 

 

 5、儘早加載綁定(類似Spring的layzload=false)

 

有時你希望在啓動時加載一個對象,可以通過以下方法實現初始化邏輯,通過在Guice必須首先初始化的單件對象上創造依賴關係來控制初始化順序。

 

 

6、在不同作用域間注入

  • 大作用域對象 ->(注入) 小作用域對象或相同作用域的對象中 是安全的。
  • 小作用域對象 ->(注入) 大作用域對象時可能會出錯,這時應該注入一個Provider<T>在需要時從較小的作用域中獲取對象,並確保在T的作用域之外,永遠不要調用這個提供者。 

 

 

7、開發階段

 

Guice 明白你的應用開發需要經歷不同的階段。你可以在創建容器時告訴它應用程序運行在哪一個階段。Guice 目前支持“開發”和“產品”兩個階段。我們發現測試通常屬於其中某一個階段。

  • 在開發階段,Guice 會根據需要加載單件對象。這樣,你的應用程序可以快速啓動,只加載你正在測試的部分。
  • 在產品階段,Guice 會在啓動時加載全部單件對象。這幫助你儘早捕獲錯誤,提前優化性能。

 

8、攔截方法

 

Guice 使用 AOP Alliance API 支持簡單的方法攔截。可以在模塊中使用 Binder 綁定攔截器。例如,對標註有 @Transactional 的方法事務攔截器:

儘量讓匹配代碼多做些過濾工作,而不是在攔截器中過濾。因爲匹配代碼只在啓動時運行一次。

10、Struts2支持

 

要在 Struts 2.0.6 或更高版本中安裝 Guice Struts 2 插件,只要將 guice-struts2-plugin-1.0.jar 包含在你的 Web 應用的 classpath 中,並在 struts.xml 文件選擇 Guice 作爲你的 ObjectFactory 實現即可:

    <constant name="struts.objectFactory" value="guice" />

 

Guice 會注入所有你的 Struts 2 對象,包括動作和攔截器。你甚至可以設置動作類的作用域。你也可以在你的 struts.xml 文件中指定 Guice 的 Module

 

    <constant name="guice.module" value="mypackage.MyModule"/>


如果你的所有綁定都是隱式的,你就根本不用定義模塊了。


 

 

 

9、可選注入

 

有時你的代碼應該在無論綁定是否存在的時候都能工作。在這些情況下,你可以使用 @Inject(optional=true),Guice 會在有綁定可用時,用一個綁定實現覆蓋你的缺省實現。例如:


如果誰爲 Formatter 創建了一個綁定,Guice 會基於該綁定注入實例。否則,如果 Formatter 不能被注入(參見隱式綁定),Guice 會忽略可選成員。

可選注入只能應用於字段和方法,而不能用於構造函數。對於方法,如果一個參數的綁定找不到,Guice 就不會注入該方法,即便其他參數的綁定是可用的。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章