写点什么

Guice 和 JavaConfig:使用 Annotation 进行反转控制的两种方式

  • 2007-03-27
  • 本文字数:1082 字

    阅读完需:约 4 分钟

随着 Guice 的最初发行版慢慢尘埃落定,将它和 Spring IoC ,尤其是和 Spring JavaConfig 进行的比较也随之浮出水面。Guice 和 JavaConfig 采取了两种不同的方式使用 Java Annotations 将 IoC 配置放入代码。

目前 Spring JavaConfig 发布了 1.0 Milestone 1 版本,它和 Guice 的基本想法是一致的——把配置从 XML 移至 Annotation 是一种更好的做法,因为这样使得配置信息与代码更为紧密。 Tapestry 的 IoC 容器也是根据同样的想法设计的。

JavaConfig 和 Guice 的背景极其相似。事实上,Bob Lee 是这样叙述它们的历史的:

此外,我还想说一个有点意思的小故事:Guice 最开始的时候和 Spring JavaConfig 看起来非常像——这并不奇怪,因为 Rod 一年前向我展示了 Spring JavaConfig(而六个月前我又让他看了 Guice)。正如使用 JavaConfig 一样,你得显式地写 Java 代码来连接你的对象。我从一开始就引入 @Inject 做为检查外部代码按照你的安排调用所有的 setters 的一种可选方式。而自打我们有了 @Inject,我开始问,我们为什么还需要显式地编写对象连接代码呢?于是很快我们就有大家今天所知道的 Guice。

关于 Guice 和 JavaConfig 区别的帖子不少。Debasish Ghosh 恰如其分地总结到

Guice 和 Spring 之间最主要的区别,可以归结为它们看待依赖关系和配置的哲学之间的差异。Spring 宣扬的是非侵入性的方式,以一种完全外部化的方式来对待对象依赖关系。在 Spring 里,你可以使用 XML、Spring JavaConfig 或者 Groovy-Spring DSL 来连接对象依赖关系,也可以使用其它的方案,如 Spring-annotations。但是,不管你用的是什么技术,依赖关系总是被外部化的。

另一方面,Guice 却把配置做为你的应用程序模型的首要对象来看待,允许它们存在于你的领域模型代码中。我们使用 Guice 模块来说明需要注入什么东西,然后使用 annotations 来指明需要在什么注入。你可以使用注入来标记(annotate)类本深(通过 @Inject annotation)。缺点则是(如果你使者么认为的话)你必须在你的领域模型中引入 com.google.inject.*。但它通过元数据编程(metadata programming)来确保了目标的方向性,以及注入的显式语义。

在这些文章的回帖中,你可以发现,在这两个框架之间做选择的时候,最值得注意的就是它们设计哲学的区别。你会希望依赖注入和代码靠得有多近呢?如果使用 Guice,你的代码将和容器紧密耦合在一起,这样做有些人喜欢,有些人反感。Guice 号称自己的速度更快,但值得注意的是,Spring IoC 容器(不管是 JavaConfig 还是其它)支持多种钩子,而 Guice 并没有提供。Spring 为大家带来的不仅仅是 IoC,而 Guice 并不打算解决那些大问题。

2007-03-27 15:301751
用户头像

发布了 117 篇内容, 共 20.7 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

直面英伟达竞争,英特尔人工智能战略解析

科技新消息

你还在因为数学对AI望而却步?看看这本秘籍吧!

博文视点Broadview

北京朝阳医院与英特尔中国研究院宣布合作,共同打造未来智慧急诊创新模式

科技新消息

Android C++系列:C++最佳实践1虚函数

轻口味

c++ android 4月月更

Trino多租户最佳实践

移动云大数据

多租户 trino

大数据培训如何实现集成Kafka与Storm的结合

@零度

kafka Storm 大数据开发

web前端培训Nestjs模块机制概念与实现原理

@零度

前端开发 nest

要想推荐系统做的好,图技术少不了

华为云开发者联盟

推荐系统 图分析 图技术 单部图 异构图

react源码解析10.commit阶段

buchila11

React

领导看了我写的关闭超时订单,让我出门左转!

阿Q说代码

RabbitMQ 延时队列 4月月更 关闭订单

直播预告 | 浅谈:云原生和容器的定义与关系

BoCloud博云

容器 云原生 直播预告

郑州轻工业大学——脑卒中患者延续性护理辅助系统的开发分享

HarmonyOS开发者

HarmonyOS 智慧生活

​深度解析英特尔的多样化人工智能战略

科技新消息

如何通过云效流水线扩展代码检测

阿里云云效

云计算 阿里云 代码 代码管理 代码检测

直播技术干货分享:千万级直播系统后端架构设计的方方面面

JackJiang

直播技术 即时通讯IM 音视频技术

jackson学习之八:常用方法注解

程序员欣宸

4月月更

Apache ShardingSphere 企业行|走进 bilibili

SphereEx

数据库 哔哩哔哩 ShardingSphere SphereEx 走进企业

英特尔中国研究院“双轮驱动,融合创新”,解锁智能发展新机遇

科技新消息

当 dbt 遇见 TiDB丨高效的数据转换工具让数据分析更简单

PingCAP

适合中小企业的文档管理软件有哪些?

小炮

企业 文档管理

深度学习模型:GPU服务器的主要应用场景

Finovy Cloud

人工智能 GPU服务器 GPU算力

Linux驱动开发-编写VS1053芯片音频驱动

DS小龙哥

4月月更

如何从阿里云Code升级至Codeup | 云效

阿里云云效

阿里云 研发效能 代码 代码管理 Codeup

构建具有跨域容灾能力的Zookeeper服务

移动云大数据

备份容灾

解决方案| anyRTC金融音视频解决方案

anyRTC开发者

音视频 WebRTC 解决方案 在线金融 视频通话

TiDB 在连锁快餐企业丨海量交易与实时分析的应用探索

PingCAP

英特尔中国研究院携手南京麒麟科创园成立智能边缘计算联合研究院,首批项目公布!

科技新消息

无惧挑战,英特尔将以全面人工智能战略重新破局

科技新消息

java培训和自学哪个适合你,自学需要什么条件

@零度

JAVA开发 自学java

从Python到C++调用过程分析|OneFlow学习笔记

OneFlow

Python 人工智能 机器学习 深度学习框架 oneflow

浅析Alluxio元数据管理的实现原理

移动云大数据

元数据 Alluxio

Guice和JavaConfig:使用Annotation进行反转控制的两种方式_Java_Rob Thornton_InfoQ精选文章