写点什么

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

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

关注

评论

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

如何在 JavaScript 中操作二维数组

devpoint

JavaScript array 数组操作 11月日更

CodeGuide 300+文档、100+代码库,一个指导程序员写代码的,Github 仓库开源啦!

小傅哥

Java GitHub 小傅哥 开源社区 代码库

TDSQL | 多类型数据库统一管理,腾讯云数据库DBhouse工具重磅发布

腾讯云数据库

数据库 tdsql

用明道云集成多平台多部门数据,发挥数据分析的力量

明道云

新时代下如何构建TDSQL-C数据库产品

腾讯云数据库

数据库 tdsql

新机遇,拨开证劵企业生态转型迷雾

大咖说

云计算 阿里云 数字化转型 数字化 企业上云

懒人畅听网,有声小说类目数据采集,多线程速采案例,Python爬虫120例之23例

梦想橡皮擦

11月日更

2021 年 Node.js 的发展趋势

CRMEB

技术架构+应用场景揭秘,为什么高斯Redis比开源香?

华为云开发者联盟

数据库 redis 开源 云原生 高斯Redis

创业自研技术团队筹建需要注意什么?

boshi

创业 团队管理

敏捷开发专家一席谈:云原生技术下的华为云DevOps实践之路

华为云开发者联盟

DevOps 敏捷开发 华为云 devcloud

TDSQL首次登上腾讯财报!金融机构核心系统落地实现规模化复制

腾讯云数据库

数据库 tdsql

题目三、简述HDFS的读写流程

arctec

微信小程序开发:使用字体图标的方法

三掌柜

11月日更

大数据训练营学习总结

arctec

【Flutter 专题】08 图解页面小跳转 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

毫米波 5G 比公共 Wifi 快近 30 倍,但覆盖范围相似

吴脑的键客

网络

MySQL打印死锁日志

Simon

MySQL 死锁

8大原则带你秒懂Happens-Before原则

华为云开发者联盟

线程 并发 Happens-Bfore Java内存

模块三

DevOps为何在中国发展滞后?

飞算JavaAI开发助手

10行代码,撸一个在线个人简历页面!

老表

Python GitHub Linux web开发 跟老表学云服务器

CSS布局之display:flex

Augus

CSS 11月日更

作业三总结

Geek_1d37ea

架构训练营

用vscode创建第一个flutter项目

坚果

flutter 11月日更

openLooKeng v1.4.1 上线,OmniData Connector 来了

LooK

大数据 openLooKeng

设计消息队列存储消息数据的MySQL表格

毛先生

体验内容更新,MindSpore轻松掌握

Geek_6cdeb6

详细剖析Kafka架构及组件

五分钟学大数据

11月日更

如何“拼”出一个页面-游戏中心模块化实践

vivo互联网技术

开发 组件化 产品方法论

Flink CDC 2.0 数据处理流程全面解析

大数据技术指南

11月日更

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