写点什么

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

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

关注

评论

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

精细化边缘安全防护:如何防止CDN域名被恶意刷量?

阿里云CloudImagine

CDN 边缘安全

阿里技术专家压箱底好货:Redis深度历险笔记

小小怪下士

Java redis 程序员

华为云对象存储OBS,安全可靠的云存储服务,让企业轻松上云

科技之光

前端监控系列4 | SDK 体积与性能优化实践

字节跳动终端技术

性能优化 前端监控 sdk 体积优化

JavaScript刷LeetCode模板技巧篇(二)

Geek_07a724

JavaScript LeetCode

华为云弹性公网IP,如何解决现代企业的网络IP烦恼

科技怪授

弹性公网IP

将 NGINX 部署为 API 网关,第 3 部分:发布 gRPC 服务

NGINX开源社区

nginx api 网关 gprc

华为云CDN,用技术实力助力企业创新,促进产业化转型

IT科技苏辞

华为云CDN,是怎样满足各行业全场景加速需求

IT科技苏辞

华为云虚拟专用网络VPN,专为解决现代企业云链路痛点而生

科技怪授

网络 网络VPN

聊一聊作为高并发系统基石之一的缓存

Java全栈架构师

Java 缓存 后端 高并发 架构师

JavaScript刷LeetCode拿offer-栈相关题目

js2030code

JavaScript LeetCode

聚焦云计算、大数据、人工智能等开源技术,这场开源开发者的盛会不容错过!

OpenAnolis小助手

人工智能 云计算 大数据 COSCon'22 开源盛会

Spring Boot「15」统一异常处理

Samson

Java spring 学习笔记 spring-boot 10月月更

特征平台在数禾的建设与应用

阿里云大数据AI技术

sql 大数据 flink 企业号十月 PK 榜

华为云虚拟专用网络VPN,为现代企业打造优质的混合云计算环境

科技怪授

网络VPN

华为云虚拟专用网络VPN,助力现代企业云上业务创新发展

科技怪授

网络 网络VPN

这几款音乐人必备的软件,你了解吗?

懒得勤快

ript刷LeetCode拿offer-树的遍历

js2030code

JavaScript LeetCode

超高性价比的云服务器-华为云耀云服务器

科技之光

10-6-华为云OBS大数据存算分离方案,助力企业顺利实现数字化转型!

科技之光

Spring Boot「16」自定义错误页面

Samson

Java spring 学习笔记 spring-boot 10月月更

NFTScan 与 Cobo 达成合作,双方将共同推动 NFT 资管安全市场的发展

NFT Research

区块链 NFT 数据基础设施

2022云原生峰会开启报名 | 一年一度云原生技术风向标就看这里!

阿里巴巴云原生

阿里云 云原生峰会

企业为什么需要UI快速开发框架

力软低代码开发平台

华为云CDN,海量资源智能路由,让内容传输更快一步

IT科技苏辞

【融云出海白皮书免费看】出海洞察之沙特的「土豪行为」盘点

融云 RongCloud

白皮书 出海

华为云对象存储OBS,为不同企业提供云存储方案,助力企业更好经营

科技之光

js通过经纬度来计算两地之间的距离

源字节1号

微信小程序 软件开发 前端开发 后端开发

华为云CDN,如何赋能企业数字化发展?

IT科技苏辞

JavaScript刷LeetCode-字符串类解题技巧

Geek_07a724

JavaScript LeetCode

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