guice:Guice和Spring框架的区别

转自: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等都是如此

下边是我做了下对比:

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 应用时候已经完成全部注射所以这个低效率问题不是问题 使用
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中定位类和类的间关系,难度低 代码级定位类和类的间关系,难度稍高

再借斧子例子说说spring 和guice 区别

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

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

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

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

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

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

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

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

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

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

一文彻底理解 Google 依赖注入(DI) 框架 Guice Guice是Google开发的轻量级依赖注入(DI)框架,遵循JSR-330标准,通过@Inject等注解实现依赖管理。与Spring相比,Guice更轻量、启动更快,适合需要精细控制对象生命周期或对性能敏感的场景。依赖注入通过将对象依赖从外部注入而非内部创建,实现解耦、可测试性和生命周期管理。Guice提供构造函数、字段和方法三种注入方式,并通过Module配置绑定关系。@Provides注解用于复杂对象的创建,而@Inject用于自动构造对象。与Spring自动扫描不同,Guice需要显式声明依赖关系, 阅读详情

相关推荐

Apache Druid源码导读--Google guice DI框架

缘起 在大数据应用组件中,有两款OLAP引擎应用广泛,一款是偏离线处理的Kylin,另一个是偏实时的Druid。Kylin是一款国人开源的优秀离线OLAP引擎,基本上是Hadoop领域离线OLAP事实标准,在离线报表,指标分析领域应用广泛。而Apache Druid则在实时OLAP领域独领风骚,优异的性能、高可用、易扩展。Kylin的实现细节网上资料很多,而Druid很少,最近打算研究下源码,写几...

Skycrab 4230

Spring-Guice:Spring 与 Guice 的桥梁

Spring-Guice:Spring 与 Guice 的桥梁 Spring-Guice 是一个开源项目,旨在为 Spring 框架和 Guice 框架之间提供桥梁,使得开发者可以在一个项目中同时使用这两个流行的依赖注入框架。该项目主要使用 Java 编程语言进行开发。 项目的基础介绍 Spring-Guice 项目提供了工具,使得 Spring 能够与 Guice 集成,反之亦然。这种集成允许开...

gitblog_00297的博客 606

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

DI容器,例如spring,picoContainer,EJB容器等等 与Guice的不同

Guice与Spring的对比

Guice与Spring的对比   Spring Guice 使用XML 使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,因此叫做依赖注入 不使用xml,将类与类之间的关系隔离到Module中,声名何处需要注入,由容器根据Module里的描述,注入被调用的对象。 使用Annotation   使用支持自定义Annotation标注,对于相同的...

xiajingsong的博客 635

鲁棒优化入门(6)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(上)

Matlab+Yalmip两阶段鲁棒优化通用编程指南(上篇),内容包括: ①.拿到一个复杂的两阶段鲁棒优化问题的分析步骤和方法。 ②.采用Yalmip工具箱中的uncertain函数和鲁棒优化模块求解两阶段鲁棒优化的子问题。 ③.Yalmip工具箱中的鲁棒优化模块和常规的求解思路有什么异同。 ④.使用KKT条件求解两阶段鲁棒优化的子问题,并使用C&CG算法进行迭代求解。

配电网和matlab的博客 1万+

一文说清Arduino如何实现舵机平滑转动(机器人场景)

深入讲解如何利用arduino控制舵机转动,实现机器人场景中的平稳运动。通过代码优化与脉冲宽度调节,让舵机动作更精准流畅,适用于各类自动化项目。

weixin_35706255的博客 899

轻量级DI框架Guice使用详解

背景在日常写一些小工具或者小项目的时候,有依赖管理和依赖注入的需求,但是Spring(Boot)体系作为DI框架过于重量级,于是需要调研一款微型的DI框架。Guice是Google出品的一...

Throwable 1145

第六节 旅烨cms实战练习 -2021.03.11

第六节 旅烨cms实战练习 -2021.03.11 前期使用win10里小皮搭建旅烨cms,以为自己的各项配置有问题,但是小皮能够正常带动DVWA,始终带动不了旅烨cms。 后来与其他安全人员交流,发现win7可以正常运行旅烨cms。 所以目前为何出现问题尚不清楚 1.环境搭建 win7+小皮 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOSTEFUw-1615475228402)(C:\Users\LuXian\AppData\Roaming\Typora\typora

lyx3429的博客 572

Guice 快速入门

转自 Guice是谷歌推出的一个轻量级依赖注入框架,帮助我们解决Java项目中的依赖注入问题。如果使用过Spring的话,会了解到依赖注入是个非常方便的功能。不过假如只想在项目中使用依赖注入,那么引入Spring未免大材小用了。这时候我们可以考虑使用Guice。本文参考了Guice官方文档,详细信息可以直接查看Guice文档。 基本使用 引入依赖 如果使用Maven的话,添加下面的...

cnhome的专栏 7416

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 482

保姆级教程:用Kalibr搞定Intel D435i三目(RGB+双目)相机联合标定,附完整ROSbag录制避坑指南

本文详细介绍了如何使用Kalibr工具对Intel D435i三目相机(RGB+双目)进行高精度联合标定,包括硬件准备、ROSbag录制技巧、Kalibr标定实战及结果验证。特别针对实际工程中的常见问题提供了解决方案,帮助开发者提升SLAM和三维重建等应用的精度。

weixin_42524762的博客 405

解读超轻量级DI容器-Guice与Spring框架的区别

依赖注入,DI(Dependency Injection),它的作用自然不必多说,提及DI容器,例如spring,picoContainer,EJB容器等等,近日,google诞生了更轻巧的DI容器……Guice!废话不多讲了,先看看Guice是如何实现注入的吧。定义一个简单的service接口和它的实现吧: public interface MyService ...{    voi

李学辉的专栏 3341

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 378

guice spring_Spring vs Guice:重要的一个关键区别

guice spring 根据弹簧对象的名称识别它们 不管使用XML还是Java配置都没有关系,Spring范围大致类似于Map <String,Object>结构。 这意味着您不能有两个名称相同的对象 。 为什么这是一件坏事? 如果您的大型应用程序具有许多@Configuration类或XML文件,则很容易意外地两次使用相同的名称。 最糟糕的部分是,将它们与多个对象...

最佳 Java 编程 569

CAPL学习之路-关键字

在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称 声明数据类型的关键字 可以用不同的关键字,声明或引用不同类型的数据 byte 声明一个字节的变量 word 声明两个字节的变量 dword 声明四个字节的变量 int 声明两个字节的整数 long 声明四个字节的变量 qword 声明八个字节的变量 char 声明一个字符串 float 声明一个浮点数,8个字节 double 声明一个浮点数,8个字节 定义一个结构体或枚举类型 struct struct Data { .

jasonj333 6108

使用Clumsy和Process Explorer定位软件高CPU占用问题

使用弱网模拟工具Clumsy和进程查看工具Process Explorer定位软件高CPU占用问题。

dvlinker的技术专栏 5706

Guice与Spring框架的区别

依赖注入,DI(Dependency Injection),它的作用自然不必多说,提及DI容器,例如spring,picoContainer,EJB容器等等,近日,google诞生了更轻巧的DI容器……Guice! 废话不多讲了,先看看Guice是如何实现注入的吧。 定义一个简单的service接口和它的实现吧: Java代码   public interface MySe

haha159257的专栏 793

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring和Guice的对比

Guice与Spring的对比 SpringGuice使用XML使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,因此叫做依赖注入不使用xml,将类与类之间的关系隔离到Module中,声名何处需要注入,由容器根据Module里的描述,注入被调用的对象。使用Annotation 使用 支持自定义Annotation标注,对于相同的接口定义的对象引用,为它们标注上不同的自定义Anno

bloomzy的专栏 2077

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring vs Guice:重要的一个关键区别

根据弹簧对象的名称识别它们 不管使用XML还是Java配置都没有关系,Spring范围大致类似于Map <String,Object>结构。 这意味着您不能有两个名称相同的对象 。 为什么这是一件坏事? 如果您的大型应用程序包含许多@Configuration类或XML文件,则很容易意外地两次使用相同的名称。 最糟糕的是,它们与多个对象一起使用时,它们会默默地相互覆...

最佳 Java 编程 478

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享

超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享 源代码下载地址:http://www.zuidaima.com/share/1759689106541568.htm

springmvc_freemarker的博客 650

spring与guice的区别

Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter方法)进行注入。 借斧子的例子说一说spring与guice的区别。   看下边的例子:对于不同社会形态下一个人(java对象,调用者)需要一把斧子(jav

qqiabc521的专栏 979

十分钟掌握Google Guice(上)

Google Guice(读音:juice)是从Google AdWords项目开源出来的一款轻量级的依赖注入(DI,Dependency Injection)框架。说到依赖注入框架,首先想到的应该就是Spring,也自然会有好事者,将Google Guice与Spring进行比较。其实比较的意义不大,因为Spring在国内基本上已经一统天下了,开始新写个业务模块,一般第一件事就是拷贝Spring...

程序员吴小胖 2万+

Guice与Spring的区别

Spring Guice 使用XML 使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,因此叫做依赖注入 不使用xml,将类与类之间的关系隔离到Module中,声名何处需要注入,由容器根据Module里的描述,注入被调用的对象。 使用Annotation   使用   支持自定义Annotation标注,使用Annotat

新之助的学习之路 2480
上一篇: 第一次java web面试总结
下一篇: java 面试基础
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值