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 就不會注入該方法,即便其他參數的綁定是可用的。