java

位置:IT落伍者 >> java >> 浏览文章

Guice整合Struts2简易教程


发布日期:2020年11月03日
 
Guice整合Struts2简易教程

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) {

usersetUserName(Name : + usergetUserName());

当然最重要的是action

@Inject

private UserService userService;

@Inject

private User user;

本教程采用字段注入

由于不采用Struts的自身的DI因此要指定为guice

<constant name=strutsobjectFactory value=guice />

<constant name=strutsinencoding value=utf />

<constant name=guicemodule value=nfigModuleConfig />

上一篇:学习Jakarta Struts 1.1 (一)

下一篇:Eclipse插件的外挂安装方法