`
phpxiaoxin
  • 浏览: 252984 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

guice:Guice和Spring框架的区别

    博客分类:
  • java
阅读更多

转自:http://www.crazycoder.cn/ :http:/www.crazycoder.cn/Java/Article47605.html


依赖注入DI(Dependency Injection)它作用自然不必多说提及DI容器例如
springpicoContainerEJB容器等等近日google诞生了更轻巧DI容器……Guice !

废话不多讲了先看看Guice 是如何实现注入吧

定义个简单service接口和它实现吧!

public erface MyService ...{
void myMethod;
}
public MyServiceImpl implements MyService ...{
public void myMethod ...{
.out.prln("HelloWorld!");
}
} 以上是最普通接口和其实现没什么可说

定义个测试类这个类里边包括service对象个引用这个对象是需要Guice 进行注入

import com.google.inject.Inject;
public Client ...{
MyService service;
@Inject //告诉容器这里service对象引用需要进行注入
void Service(MyService service) ...{ //这里思路方法名字可以任意定义
this.service = service;
}
public void myMethod ...{
service.myMethod;
}
} 这里除了加了个@Inject和Spring 配置没有任何区别@Inject是表示对容器说这里service需要注射等到运
行时候容器会拿来个例子给service完成注射过程

定义GuiceModule文件告诉容器如何进行注入

import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;
public MyModule implements Module ...{
public void configure(Binder binder) ...{
binder.bind(MyService.).to(MyServiceImpl.).in(Scopes.SINGLETON);
// 这句代码意思是说:运行时动态将MyServiceImpl对象赋给MyService定义对象
而且这个对象是单例
}
} 创建测试类

import com.google.inject.Guice ;
import com.google.inject.Injector;
public Test ...{
public void (String args) ...{
MyModule module = MyModule;// 定义注射规则
Injector injector = Guice .createInjector(module);// 根据注射规则生成注射者
Client client = Client;
injector.injectMembers(client);// 注射者将需要注射bean按照规则把client这个客户端进行注射
client.myMethod;
}
} 运行测试类控制台输出:Hello,World!

完成注入过程

下面看看Guice 还有哪些其它使用特性

1,如果在实现你确定MyService定义对象就要被注射为MyServiceImpl而不是其它实现类话可以在
MyService接口加上@ImplementedBy(MyServiceImpl.)

import com.google.inject.ImplementedBy;
@ImplementedBy(MyServiceImpl.)
//我总觉得这样有点背离了依赖注入初衷了
public erface MyService ...{
void myMethod;
} 这样话在MyModule里configure思路方法中就可以不加任何东西容器就会自动注射给MyServiceImpl对


2,可以对Field进行注解式注入

在Client.java中也可以把这个@Inject标注在MyService service;前边如:@Inject MyService service;

3,可使用自定义Annotation标注

package mypackage;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.google.inject.BindingAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@Target( ...{ ElementType.FIELD, ElementType.PARAMETER })
@BindingAnnotation
public @erface MyInterface ...{
} 那么Client.java需要改为:

package mypackage;
import com.google.inject.Inject;
public Client ...{
@Inject @MyInterface MyService service;
void Service(MyService service) ...{ // 这里思路方法名字可以任意定义
this.service = service;
}
public void myMethod ...{
service.myMethod;
}
} MyModule.java中configure思路方法内容需改为:

binder.bind(MyService.).annotatedWith(MyInterface.).to(
MyServiceImpl.).in(Scopes.SINGLETON); 意思是说对于标注为MyInterfaceMyService定义对象进行注入

进行Annotation标注成员(Field,method,argument等)进行自定义Annotation标注该成员既拥有该属性可
以在运行根据这些成员区别属性做些区别事情 例如:springAspectJxdoclet等都是如此

下边是我做了下对比:

GuiceSpring 对比

Spring Guice
使用XML 使用将类和类的间关系隔离到xml中由容器负责注入被对象因此叫做依赖注入 不使用xml,将类和类
的间关系隔离到Module中声名何处需要注入由容器根据Module里描述注入被对象
使用Annotation 使用

支持自定义Annotation标注对于相同接口定义对象引用为它们标注上区别自定义Annotation注释就可以
达到同个类里边同个接口引用注射给区别实现在Module里用标注做区分灵活性大大增加

使用Annotation也未必是好事范型等新特性也未必是好事目前大多服务器均不支持jdk1.5,wls要9以前才支
持而目前客户由于价格原因也很少选用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 异曲同功
支持多种注入方式 构造器ter思路方法 Field,构造器ter思路方法
灵活性 1,如果同个接口定义引用需要注入区别实现就要编写区别Module烦琐

2,动态注入

如果你想注射个实现你还未知呢如何办呢spring 是没办法事先在配置文件里写死而Guice 就可以做到就是说
我想注射这个对象我还不知道注射给谁呢是在运行时才能得到这个接口实现所以这就大大提高了依赖注射灵活
性动态注射
和现有框架集成度 1高众多现有优秀框架(如struts1.x等)均提供了spring 集成入口而且spring 已经不仅仅是依
赖注入包括众多方面

2Spring 也提供了对Hibernate等集成可大大简化开发难度

3提供对于orm,rmi,webservice等等接口众多体系庞大 1可以和现有框架集成不过仅仅依靠个效率稍高
DI就想取代spring 地位有点难度
配置复杂度 在xml中定位类和类的间关系,难度低 代码级定位类和类的间关系,难度稍高

再借斧子例子说说springguice 区别

看下边对于区别社会形态下个人(java对象者)需要把斧子(java对象被者)例子:

(1)原始社会时劳动社会基本没有分工需要斧子人(者)只好自己去磨把斧子每个人拥有自己斧子如果把大家
石斧改为铁斧需要每个人都要学会磨铁斧本领工作效率极低

对应Java里情形是:java里者个被者例子类耦合度极高修改维护烦琐效率极低

(2)工业社会时工厂出现斧子不再由普通人完成而由工厂生产当人们需要斧子时候可以到工厂购买斧子无需
关心斧子是如何制造出来如果废弃铁斧为钢斧只需改变工厂制造工艺即可制作工艺是工厂决定工厂生产什么斧
子工人们就得用什么斧子

对应Java里情形是:Java者可以以来简单工厂创建被者变化点被隔离到了简单工厂里虽然耦合度降低但是者
会和工厂耦合而且需要定位自己工厂

(3)近代工业社会工厂蓬勃发展人们需要什么斧子只需要提供个斧子图形商家会按照你提供图形将你斧子订
做好送上门

对应Java里情形:spring 依赖注入

(4)进入按需要分配社会信息进入现代化人们不再去工厂购买斧子不再拘泥于需要什么斧子事先画好什么样
图形只需要打个电话描述下需要什么类型斧子或许想打造个物美价廉斧子商家会根据市场零件价格计算出最优
制作工艺打造最适合斧子送过来更加信息化更加人性化

对应Java里情形:基于描述注入动态灵活简单注入如:Guice

对于该不该使用Guice 我想也是仁者见仁智者见智就象好多论坛里动不动有人会在那里讨论到底学Java还
是学.net或者是使用eclipse还是Jbuilder这类无聊话题适合和满足项目需求又能省工省力简单完成工作就是最

分享到:
评论

相关推荐

    Guice与Spring框架的区别.pdf

    下面我们来讨论Guice和Spring框架的区别。 Guice框架 Guice是Google开发的轻量级DI容器,主要特点是轻量级、快速、灵活。Guice的主要特性包括: * 轻量级:Guice的jar包只有几百KB,非常小巧,非常适合需要快速...

    Google Guice: Agile Lightweight Dependency Injection Framework

    - **对比Guice与其他框架**:了解Guice与Spring等其他框架之间的异同。 - **未来展望**:探索Guice的发展方向以及如何将其标准化到未来的Java EE或SE规范中。 - **实战应用**:学习如何使用Guice构建真实的Web应用...

    DI容器框架Google Guice与Spring框架的区别

    "DI容器框架Google Guice与Spring框架的区别" 这个标题表明我们要探讨的是两种不同的依赖注入(Dependency Injection,简称DI)容器——Google Guice和Spring框架之间的差异。DI是一种设计模式,它帮助开发者在对象...

    guice-spring-3.2.3.zip

    标题 "guice-spring-3.2.3.zip" 提示我们关注的是Guice与Spring框架的一个特定版本的集成,即Guice 3.2.3与Spring的整合。Guice是一个轻量级的依赖注入(DI)框架,由Google开发,它允许开发者通过注解来管理对象的...

    使用Spring in Guice和Guice in Spring的工具(高分项目).zip

    SSM是一种常用的Java开发框架组合,它结合了Spring框架、Spring MVC框架和MyBatis框架的优点,能够快速构建可靠、高效的企业级应用。 1. Spring框架:Spring是一个轻量级的Java开发框架,提供了丰富的功能和模块,...

    初试Guice(转)

    此外,文章可能还会涵盖Guice与其他依赖注入框架(如Spring)的对比,以突出Guice的轻量化和灵活性。 总之,Guice是一个强大的工具,能帮助开发者构建松散耦合、易于测试和维护的Java应用。通过深入学习和实践,你...

    guice-3.0.rar

    - guice-spring-3.0.jar提供了Guice与Spring框架的整合,使得开发者可以利用Guice的灵活性和Spring的功能。它可以将Spring的bean注入到Guice管理的环境中,反之亦然。 - Spring的XML配置可以通过Guice的模块进行...

    guice超轻量级依赖注入

    Guice,全称为Google Guice,是一款由Google开发的轻量级依赖注入(Dependency Injection,简称DI)框架,主要用于简化Java应用的初始化和组件管理。依赖注入是一种设计模式,它可以帮助开发者解耦代码,提高软件的...

    spring cloud 基本开发框架.rar_VM7_cloud_guice-grapher_spring cloud_spr

    这个压缩包"spring cloud 基本开发框架.rar"显然是为了帮助开发者理解和实践 Spring Cloud 的基本概念和技术。 首先,让我们详细了解一下 Spring Cloud 的核心组件: 1. **Eureka**:服务注册与发现。Eureka 是 ...

    goole-guice所有JAR包

    Guice以其简洁的API和对Java注解的充分利用,成为了Java开发中一个受欢迎的选择,尤其是对于那些不希望使用更大型的IoC框架如Spring的项目。 Guice的核心概念包括: 1. **依赖注入**:Guice通过构造函数、字段或...

    google-guice

    5. `guice-spring-1.0.jar`:这个扩展允许Guice与Spring框架协同工作,让两个强大的依赖注入框架能够无缝交互。 6. `javadoc`:包含了Guice的API文档,对理解和使用Guice非常有帮助。 Guice的使用步骤通常包括: 1....

    shiro和guice整合,使用权限注解

    而 Guice 是一个轻量级的依赖注入框架,它能帮助开发者管理对象的生命周期和依赖关系,使得代码更简洁、可测试性更强。 Shiro 的权限注解在实现细粒度的权限控制方面发挥着关键作用。例如,`@...

    Java依赖注入框架Guice2

    Java依赖注入框架Guice2是Google开发的一款轻量级的依赖注入库,它极大地简化了Java应用程序中的对象...在实际项目中,结合Guice2和其他Java框架(如Spring)的经验,可以更好地理解和应用依赖注入这一核心设计原则。

    Google Guice与MyBatis集成,并实现发送邮件轮询

    Google Guice 这个高效的与Spring类似的依赖注入框架; MyBatis配置和使用; Google Guice与MyBatis集成,支持注解事务,简单的无法想象; Mybatis与mysql集成;实现发送邮件轮询; 源码是个web项目,里面有数据库的...

    GuiceSpring.rar

    标题 "GuiceSpring.rar" 和描述中的 "GuiceSpring.rar" 暗示了这个压缩包可能包含了关于Google Guice和Spring框架集成的相关资料。标签 "GuiceSpring" 进一步确认了这一主题。虽然没有具体的文件内容可以参考,但...

    Guice4.2_jar及使用手册及示例

    Spring框架的依赖注入是家喻户晓的,但是在实际的开发中我们想使用便捷的依赖注入功能,但是又不想引入Spring框架的复杂性,该怎么办呢? Google Guice一个不错选择。本资源中GUICE的使用方法和使用示例

    Google guice

    Guice与传统的XML配置的IoC框架(如Spring)相比,更加简洁且易于理解和使用。由于其轻量级的特性,它非常适合小型项目和嵌入式系统,同时也可作为大型项目的基础架构组件。 在实际开发中,结合Guice的**Easy Pool*...

    guice3 + struts2.2 整合

    在IT行业中,Guice和Struts2是两个非常重要的Java框架,它们分别专注于依赖注入(DI)和Web应用的MVC架构。本文将详细介绍如何整合Guice3与Struts2.2,以及这两个框架的核心概念和配置过程。 首先,Guice3是一个轻...

Global site tag (gtag.js) - Google Analytics