Guice簡介
Helloworld
簡介本文為如何用Guice進行DI和如何整合Struts
簡介
Guice是Google推出的一款DI框架因其優秀榮獲了Jolt大獎和Spring相比要輕量很多運行時只要指定一個配置類實現其comgoogleinjectModule接口指定接口和實現類即可
需要的基礎jar包有
Guice需要的jar包如果是web應用需要guiceservletjar整合Struts則需要guicestrutspluginjar
aopalliancejar
guicejar
guiceservletjar
guicestrutspluginjar
Struts需要的jar包
commonsfileuploadjar
commonsiojar
commonsloggingjar
freemarkerjar
ognljar
strutscorejar
xworkjar
Guice與Spring的對比(此表格轉自網絡)
Spring
Guice
使用XML
使用將類與類之間的關系隔離到xml中由容器負責注入被調用的對象因此叫做依賴注入
不使用xml將類與類之間的關系隔離到Module中聲名何處需要注入由容器根據Module裡的描述注入被調用的對象
使用Annotation
使用
支持自定義Annotation標注對於相同的接口定義的對象引用為它們標注上不同的自定義Annotation注釋就可以達到同一個類裡邊的同一個接口的引用注射給不同的實現在Module裡用標注做區分靈活性大大增加
使用Annotation也未必是好事范型等新特性也未必是好事目前大多的服務器均不支持jdkwls要以前才支持而目前的客戶由於價格原因也很少選用wls的至少我們做過的項目中都沒有功能再強客戶不需要何用?
運行效率
裝載spring配置文件時需解析xml效率低getBean效率也不高不過使用環境不會涉及到getBean只有生產環境的時候會用到getBean在裝載spring應用程序的時候已經完成全部的注射所以這個低效率的問題不是問題
使用Annotationcglib 效率高與spring最明顯的一個區別spring是在裝載spring配置文件的時候把該注入的地方都注入完而Guice呢則是在使用的時候去注射運行效率和靈活性高
類耦合度
耦合度低強調類非侵入以外部化的方式處理依賴關系類裡邊是很干淨的在配置文件裡做文章對類的依賴性極低
高代碼級的標注DI標記@inject侵入代碼中耦合到了類層面上來何止侵入簡直侵略代碼耦合了過多guice的東西大大背離了依賴注入的初衷對於代碼的可維護性可讀性均不利
類編寫時
需要編寫xml配置Bean配置注入
只需聲明為@inject等著被注入
最後在統一的Module裡聲明注入方式
僅支持IOC
否spring目前已經涉獵很多部分
是目前僅僅是個DI容器
是否易於代碼重構
統一的xml配置入口更改容易
配置工作是在Module裡進行和spring異曲同功
支持多種注入方式
構造器setter方法
Field構造器setter方法
靈活性
如果同一個接口定義的引用需要注入不同的實現就要編寫不同的Module煩瑣
動態注入
如果你想注射的一個實現你還未知呢怎麼辦呢spring是沒辦法事先在配置文件裡寫死的而Guice就可以做到就是說我想注射的這個對象我還不知道注射給誰呢是在運行時才能得到的的這個接口的實現所以這就大大提高了依賴注射的靈活性動態注射
與現有框架集成度
高眾多現有優秀的框架(如strutsx等)均提供了spring的集成入口而且spring已經不僅僅是依賴注入包括眾多方面
Spring也提供了對Hibernate等的集成可大大簡化開發難度
提供對於ormrmiwebservice等等接口眾多體系龐大
可以與現有框架集成不過僅僅依靠一個效率稍高的DI就想取代spring的地位有點難度
配置復雜度
在xml中定位類與類之間的關系難度低
代碼級定位類與類之間的關系難度稍高
關於Annotation的簡介可以查看筆者另一篇教程
%E%AE%%E%BB%B
Helloworld
筆者寫了一個demo對於簡單的應用Guice還是比Spring方便很多
└─com
└─greysh
└─guice
├─action
│ UserActionjava
│
├─config
│ ModuleConfigjava
│
├─model
│ Userjava
│
└─service
│ UserServicejava
│
└─impl
UserServiceImpljava
代碼見附件
Guie加載的原理是
先去調用自己實現Module接口的類這個類類似Spring的applicationcontext然後調用configure函數的binder進行綁定相當於spring裡面的ref綁定然後綁定完後就在需要注入的放指定 @Inject 進行注入主要有構造函數注入方法注入字段注入一般而言用方法注入
本教程的User為實體類僅僅有一個字段userName;
public interface UserService {
void invoke(User user);
}
對於接口實現
public void invoke(User user) {
user
setUserName(
Name :
+ user
getUserName());
當然最重要的是action
@Inject
private UserService userService;
@Inject
private User user;
本教程采用字段注入
由於不采用Struts的自身的DI因此要指定為guice
<constant name=
struts
objectFactory
value=
guice
/>
<constant name=
struts
i
n
encoding
value=
utf
/>
<constant name=
guice
module
value=
nfig
ModuleConfig
/>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28927.html