Guice整合Struts2簡(jiǎn)易教程
1. Guice簡(jiǎn)介
  
Guice是Google推出的一款DI框架,因其優(yōu)秀榮獲了Jolt大獎(jiǎng)。和Spring相比,要輕量很多。運(yùn)行時(shí)只要指定一個(gè)配置類,實(shí)現(xiàn)其com.google.inject.Module接口,指定接口和實(shí)現(xiàn)類即可。
  
需要的基礎(chǔ)jar包有
  
Guice需要的jar包,如果是web應(yīng)用,需要guice-servlet-2.0.jar,整合Struts2則需要guice-struts2-plugin-2.0.jar
  
aopalliance.jar
  
guice-2.0.jar
  
guice-servlet-2.0.jar
  
guice-struts2-plugin-2.0.jar
  
Struts2需要的jar包
  
commons-fileupload-1.2.1.jar
  
commons-io-1.3.2.jar
  
commons-logging-1.0.4.jar
  
freemarker-2.3.13.jar
  
ognl-2.6.11.jar
  
struts2-core-2.1.6.jar
  
xwork-2.1.2.jar
| 
 Guice與Spring的對(duì)比  | ||
| 
 
  | 
 Spring  | 
 Guice  | 
| 
 使用XML  | 
 使用將類與類之間的關(guān)系隔離到xml中,由容器負(fù)責(zé)注入被調(diào)用的對(duì)象,因此叫做依賴注入  | 
 不使用xml,將類與類之間的關(guān)系隔離到Module中,聲名何處需要注入,由容器根據(jù)Module里的描述,注入被調(diào)用的對(duì)象。  | 
| 
 使用Annotation  | 
 
  | 
 使用  | 
| 
 運(yùn)行效率  | 
 裝載spring配置文件時(shí),需解析xml,效率低,getBean效率也不高,不過(guò)使用環(huán)境不會(huì)涉及到getBean,只有生產(chǎn)環(huán)境的時(shí)候會(huì)用到getBean,在裝載spring應(yīng)用程序的時(shí)候,已經(jīng)完成全部的注射,所以這個(gè)低效率的問(wèn)題不是問(wèn)題。  | 
 使用Annotation,cglib, 效率高與spring最明顯的一個(gè)區(qū)別,spring是在裝載spring配置文件的時(shí)候把該注入的地方都注入完,而Guice呢,則是在使用的時(shí)候去注射,運(yùn)行效率和靈活性高。  | 
| 
 類耦合度  | 
 耦合度低,強(qiáng)調(diào)類非侵入,以外部化的方式處理依賴關(guān)系,類里邊是很干凈的,在配置文件里做文章,對(duì)類的依賴性極低。  | 
 高,代碼級(jí)的標(biāo)注,DI標(biāo)記@inject侵入代碼中,耦合到了類層面上來(lái),何止侵入,簡(jiǎn)直侵略,代碼耦合了過(guò)多guice的東西,大大背離了依賴注入的初衷,對(duì)于代碼的可維護(hù)性,可讀性均不利  | 
| 
 類編寫(xiě)時(shí)  | 
 需要編寫(xiě)xml,配置Bean,配置注入  | 
 只需聲明為@inject,等著被注入,  | 
| 
 僅支持IOC  | 
 否,spring目前已經(jīng)涉獵很多部分  | 
 是,目前僅僅是個(gè)DI容器  | 
| 
 是否易于代碼重構(gòu)  | 
 統(tǒng)一的xml配置入口,更改容易  | 
 配置工作是在Module里進(jìn)行,和spring異曲同功  | 
| 
 支持多種注入方式  | 
 構(gòu)造器,setter方法  | 
 Field,構(gòu)造器,setter方法  | 
| 
 靈活性  | 
 
  | 
 1,如果同一個(gè)接口定義的引用需要注入不同的實(shí)現(xiàn),就要編寫(xiě)不同的Module,煩瑣 2,動(dòng)態(tài)注入 如果你想注射的一個(gè)實(shí)現(xiàn),你還未知呢,怎么辦呢,spring是沒(méi)辦法,事先在配置文件里寫(xiě)死的,而Guice就可以做到,就是說(shuō)我想注射的這個(gè)對(duì)象我還不知道注射給誰(shuí)呢,是在運(yùn)行時(shí)才能得到的的這個(gè)接口的實(shí)現(xiàn),所以這就大大提高了依賴注射的靈活性,動(dòng)態(tài)注射。  | 
| 
 與現(xiàn)有框架集成度  | 
 1, 高,眾多現(xiàn)有優(yōu)秀的框架(如struts1.x等)均提供了spring的集成入口,而且spring已經(jīng)不僅僅是依賴注入,包括眾多方面。  | 
 1,可以與現(xiàn)有框架集成,不過(guò)僅僅依靠一個(gè)效率稍高的DI,就想取代spring的地位,有點(diǎn)難度。  | 
| 
 配置復(fù)雜度  | 
 在xml中定位類與類之間的關(guān)系,難度低  | 
 代碼級(jí)定位類與類之間的關(guān)系,難度稍高  | 
2Helloworld
  
筆者寫(xiě)了一個(gè)demo,對(duì)于簡(jiǎn)單的應(yīng)用Guice還是比Spring方便很多
└─com
└─greysh
└─guice
├─action
│ UserAction.java
│
├─config
│ ModuleConfig.java
│
├─model
│ User.java
│
└─service
│ UserService.java
│
└─impl
UserServiceImpl.java
  
代碼見(jiàn)附件
  
Guie加載的原理是先去調(diào)用自己實(shí)現(xiàn)Module接口的類,這個(gè)類類似Spring的applicationcontext.然后調(diào)用configure函數(shù)的binder進(jìn)行綁定,相當(dāng)于spring里面的ref綁定,然后綁定完后就在需要注入的放指定 @Inject 進(jìn)行注入,主要有構(gòu)造函數(shù)注入,方法注入,字段注入。一般而言用方法注入
  
本教程的User為實(shí)體類,僅僅有一個(gè)字段userName;  
public interface UserService { | 
對(duì)于接口實(shí)現(xiàn)
public void invoke(User user) { | 
當(dāng)然最重要的是action  
@Inject  | 
本教程采用字段注入
由于不采用Struts2的自身的DI,因此要指定為guice
 <CONSTANT value="com.greysh.guice.config.ModuleConfig" name="guice.module" />  | 
您正在閱讀的是“Guice整合Struts2簡(jiǎn)易教程”
【編輯推薦】















 
 
 
 
 
 
 