程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Guice整合Struts2簡易教程

Guice整合Struts2簡易教程

編輯:關於JAVA

1.Guice簡介

2.Helloworld

簡介:本文為如何用Guice進行DI和如何整合Struts2

1. 簡介

Guice是Google推出的一款DI框架,因其優秀榮獲了Jolt大獎。和Spring相比,要輕量很多。運行時只要指定一個配置類,實現其com.google.inject.Module接口,指定接口和實現類即可。

需要的基礎jar包有

Guice需要的jar包,如果是web應用,需要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的對比(此表格轉自網絡)   Spring Guice 使用XML 使用將類與類之間的關系隔離到xml中,由容器負責注入被調用的對象,因此叫做依賴注入 不使用xml,將類與類之間的關系隔離到Module中,聲名何處需要注入,由容器根據Module裡的描述,注入被調用的對象。 使用Annotation   使用

支持自定義Annotation標注,對於相同的接口定義的對象引用,為它們標注上不同的自定義Annotation注釋,就可以達到同一個類裡邊的同一個接口的引用,注射給不同的實現,在Module裡用標注做區分,靈活性大大增加。

使用Annotation也未必是好事,范型等新特性也未必是好事,目前大多的服務器均不支持jdk1.5,wls要9以前才支持,而目前的客戶由於價格原因也很少選用wls9的,至少我們做過的項目中都沒有。功能再強,客戶不需要,何用? 運行效率 裝載spring配置文件時,需解析xml,效率低,getBean效率也不高,不過使用環境不會涉及到getBean,只有生產環境的時候會用到getBean,在裝載spring應用程序的時候,已經完成全部的注射,所以這個低效率的問題不是問題。 使用Annotation,cglib, 效率高與spring最明顯的一個區別,spring是在裝載spring配置文件的時候把該注入的地方都注入完,而Guice呢,則是在使用的時候去注射,運行效率和靈活性高。 類耦合度 耦合度低,強調類非侵入,以外部化的方式處理依賴關系,類裡邊是很干淨的,在配置文件裡做文章,對類的依賴性極低。 高,代碼級的標注,DI標記@inject侵入代碼中,耦合到了類層面上來,何止侵入,簡直侵略,代碼耦合了過多guice的東西,大大背離了依賴注入的初衷,對於代碼的可維護性,可讀性均不利 類編寫時 需要編寫xml,配置Bean,配置注入 只需聲明為@inject,等著被注入,

最後在統一的Module裡聲明注入方式 僅支持IOC 否,spring目前已經涉獵很多部分 是,目前僅僅是個DI容器 是否易於代碼重構 統一的xml配置入口,更改容易 配置工作是在Module裡進行,和spring異曲同功 支持多種注入方式 構造器,setter方法 Field,構造器,setter方法 靈活性   1,如果同一個接口定義的引用需要注入不同的實現,就要編寫不同的Module,煩瑣

2,動態注入

如果你想注射的一個實現,你還未知呢,怎麼辦呢,spring是沒辦法,事先在配置文件裡寫死的,而Guice就可以做到,就是說我想注射的這個對象我還不知道注射給誰呢,是在運行時才能得到的的這個接口的實現,所以這就大大提高了依賴注射的靈活性,動態注射。 與現有框架集成度 1,高,眾多現有優秀的框架(如struts1.x等)均提供了spring的集成入口,而且spring已經不僅僅是依賴注入,包括眾多方面。

2,Spring也提供了對Hibernate等的集成,可大大簡化開發難度。

3,提供對於orm,rmi,webservice等等接口眾多,體系龐大。 1,可以與現有框架集成,不過僅僅依靠一個效率稍高的DI,就想取代spring的地位,有點難度。 配置復雜度 在xml中定位類與類之間的關系,難度低 代碼級定位類與類之間的關系,難度稍高

關於Annotation的簡介,可以查看筆者另一篇教程

http://developers.sun.com.cn/blog/functionalca/entry/annotation%E7%AE%80%E4%BB%8B

2Helloworld

筆者寫了一個demo,對於簡單的應用Guice還是比Spring方便很多

└─com

└─greysh

└─guice

├─action

│ UserAction.java

├─config

│ ModuleConfig.java

├─model

│ User.java

└─service

│ UserService.java

└─impl

UserServiceImpl.java

代碼見附件

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;

本教程采用字段注入

由於不采用Struts2的自身的DI,因此要指定為guice

<constant name="struts.objectFactory" value="guice" />
<constant name="struts.i18n.encoding" value="utf8" />
<constant name="guice.module" value="com.greysh.guice.config.ModuleConfig" />

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved