写点什么

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

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

关注

评论

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

网络安全检测神器:实战案例解析高效端口扫描技术

幂简集成

网络安全 Python JSON 网络端口扫描

九章云极DataCanvas公司入选沙利文权威报告领先代表厂商

九章云极DataCanvas

Karmada新版本发布,支持联邦应用跨集群滚动升级

华为云开发者联盟

容器 Karmada Kubernetes Serverless 开源、 云原生‘’

Git fetch、pull 傻傻分不清楚?

极狐GitLab

git gitlab 代码托管 版本管理

“2024年网络安全国家标准贯标深度行(互联网行业—百度站)”活动在北京举办

百度安全

2024 百度安全月圆满收官:让百度更安全,让用户更放心

百度安全

技术解读:华为云如何携手昇腾、鸿蒙等根生态,助力开发者技术创新

华为云开发者联盟

华为云 鲲鹏计算 大模型 昇腾

ECCV 2024 | 融合跨模态先验与扩散模型,快手处理大模型让视频画面更清晰!

快手技术

音视频开发 大模型

融云携高潜市场出海攻略亮相「2024 拉美中东北非出海峰会」

融云 RongCloud

高效算力网助推智算时代繁荣发展

极客天地

百万度算力,限时免费送送送送送!

九章云极DataCanvas

Mint 101: 全面解读 Mint Blockchain 生态和参与指南

NFT Research

blockchain NFT\ 空投

HarmonyOS NEXT实战电话拨打

李洋-蛟龙腾飞

HarmonyOS NEXT

DORA指标实施反模式:如何避免正确实施DORA

俞凡

DevOps 最佳实践 DORA

缺陷管理的全面剖析:从发现到修复,优化软件产品质量

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

测试

TDengine 建模实战:手把手教你高效设计数据结构

TDengine

数据库 tdengine 时序数据库

线上事故案例集:从分析到预防的全方位指南

巧手打字通

后端 事故 风险管理 事故复盘 安全研发

聊聊性能基准测试和容量评估规划

老张

性能测试 容量规划 基准测试

Volcano新版本发布:10大功能提升统一调度和细粒度资源管理能力

华为云开发者联盟

Volcano 批量计算 云原生‘’ #GPU kubernetes pod

软件缺陷处理为什么那么重要?

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

测试

如何建立一个完善的缺陷管理流程?

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

测试

CEX上币趋势分析:Infra赛道与Ton生态的未来

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 代币开发

探索AI新境界!昇腾AI原生创新算子挑战赛(S2赛季)决赛顺利闭幕

极客天地

融云出海城市沙龙干货分享:电商、社交泛娱的破局之道

融云 RongCloud

软件测试的对象:从单元到系统,全方位覆盖的测试层级

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

测试

《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略

华为云开发者联盟

php 元宇宙 人工智能’ 华为云DTSE 云原生‘’

这些售后管理的问题,你遇到过多少?

天津汇柏科技有限公司

低代码 软件定制开发 售后 AI 人工智能

Solana Payment:下一波加密支付革命的崛起

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 代币开发

软件测试的核心原则:确保质量的六大基石

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

测试

缺陷处理流程的最佳实践

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

测试

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