« Project Kenai 开发平台 | Main | 在Taverna中创建科学工作流 »
http://developers.sun.com.cn/blog/functionalca/date/20090526 星期二 2009年05月26日

Guice整合Struts2简易教程

Guice整合Struts2简易教程
作者:曹祺
Blog: http://blogs.sun.com/greysh
Web: http://www.greysh.com  
Email: Qi.Cao@Sun.com
本文链接:
http://developers.sun.com.cn/blog/functionalca/entry/guice%E6%95%B4%E5%90%88struts2%E7%AE%80%E6%98%93%E6%95%99%E7%A8%8B 
源代码下载:
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Guice_Struts2.part1.rar
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Guice_Struts2.part2.rar
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Guice_Struts2.part3.rar
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Guice_Struts2.part4.rar
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Guice_Struts2.part5.rar

难度:入门

Guice: http://code.google.com/p/google-guice/    

1.Guice简介
2
.Helloworld

简介:本文为如何用Guice进行DI和如何整合Struts2

1.     简介
GuiceGoogle推出的一款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

GuiceSpring的对比(此表格转自网络)

 

Spring

Guice

使用XML

使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,因此叫做依赖注入

不使用xml,将类与类之间的关系隔离到Module中,声名何处需要注入,由容器根据Module里的描述,注入被调用的对象。

使用Annotation

 

使用
支持自定义Annotation标注,对于相同的接口定义的对象引用,为它们标注上不同的自定义Annotation注释,就可以达到同一个类里边的同一个接口的引用,注射给不同的实现,在Module里用标注做区分,灵活性大大增加。
使用Annotation也未必是好事,范型等新特性也未必是好事,目前大多的服务器均不支持jdk1.5,wls9以前才支持,而目前的客户由于价格原因也很少选用wls9的,至少我们做过的项目中都没有。功能再强,客户不需要,何用?

运行效率

装载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方法

灵活性

 

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接口的类,这个类类似Springapplicationcontext.然后调用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" />



发表于 Sun Functional 校园大使 [JavaEE] ( 五月 26, 2009 02:09 下午 ) Permalink | 评论[0]
评论:

发表一条评论:
  • HTML语法: 禁用