写点什么

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:301785
用户头像

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

关注

评论

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

轻松实践:用Python实现“名字大作战”游戏,表白Zulu!

Comate编码助手

代码自动生成 AI 编程 文心快码 文心快码Zulu

Error resolving template [excel/readExcel], template might not exist or might not be accessible by

刘大猫

人工智能 数据挖掘 大数据 算法 数据分析

从“被动监控”到“主动优化”:MyEMS 重构能源管理价值的路径

开源能源管理系统

开源 开源能源管理系统

新客户 | 7% 压缩率、毫秒级查询,这套金融数据平台让交易回放更快

TDengine

tdengine 时序数据库

AI 一体机未来技术趋势详解

慢点科技SlowTech

高效连接用户,赋能企业增长!12款主流推送类SDK完成鸿蒙5适配

新消费日报

可灵AI数字人来了!快手重磅发布Kling-Avatar,面向多模态指令理解与控制的数字人长视频生成新范式

快手技术

音视频 大模型 数字人 可灵 可灵AI

MySQL分库分表迁移:ETL平台如何实现数据合并与聚合

谷云科技RestCloud

MySQL 数据传输 数据同步 数据迁移 ETL

四年零故障,存储成本降九成——中冶京诚钢铁车间数据中心实践

TDengine

tdengine 时序数据库

MySQL 数据归档的技术困境与 Databend 解决之道

Databend

超融合架构的进阶之路:如何解锁性能与规模的双重跃升?

智驱前线

车机体验的“老大难”,华为云CloudDevice用端云协同来解

Alter

云主机 端云协同 汽车电机

华为云:以AI榫卯,建智能广厦

脑极体

AI

能源三变:全场景构网、AI与高质量,联手改写能源格局

脑极体

AI

AI中的潜意识学习:大语言模型隐藏的安全隐患

qife122

AI安全 潜意识学习

超全参会指南 “操作系统开源与 AI 进化分论坛”就等你来 | 2025 云栖大会

OpenAnolis小助手

AI 操作系统 云栖大会 龙蜥社区

FICO 借贷 入门解释

机机复唧唧

SAP FICO

iPaaS 平台的API 管理 + API编排,如何支持企业数字化转型

谷云科技RestCloud

数据传输 集成平台 API管理 ipaas api编排

CCF 大数据学术会议 | TDengine 解析工业大数据从“能存”到“能用”的转变

TDengine

tdengine 时序数据库 idmp

第一次参与开源的时序数据库 IoTDB Committer:这份成就感是无可替代的

Apache IoTDB

成立22年,魅族为何选择“归航”?

趣解商业

数码 魅族22 魅族科技

AI 大模型入门 四:检索增强生成(RAG),自动生成精准用例!

测吧(北京)科技有限公司

哪些AI软件值得推荐?10个国内外主流AI工具大盘点

职场工具箱

人工智能 效率工具 AIGC AI工具 AI生成PPT

博文干货 | Pulsar 平均负载器(AvgShedder)

AscentStream

消息队列

AI一句话生成UI设计稿,产品开发效率猛涨!

职场工具箱

人工智能 AIGC ui设计 在线设计工具 界面设计

抢先看 中兴通讯、安谋科技等企业大咖演讲亮点一览|2025 云栖大会

OpenAnolis小助手

AI 操作系统 云栖大会

经验分享 —— 在 Ubuntu 虚拟机中部署 OceanBase 数据库

老纪的技术唠嗑局

ubuntu oceanbase 安装部署

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