50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

HiveServer2 内存泄漏问题定位与优化方案

Java-fenn

Java Java 面试 #java

设备健康管理平台如何为企业打造五大核心设备管理体系?

PreMaint

企业设备管理 预测性维护 设备健康管理

干货 | REST-assured 获取日志到文件并结合 Allure 报告进行展示

霍格沃兹测试开发学社

干货 | 一文搞定 Docker 容器技术与常用命令

霍格沃兹测试开发学社

同事多线程使用不当导致OOM,被我怒怼了

Java-fenn

Java

VS Code加码Java生产力,IDEA危险了

Java-fenn

Java

Chrome已实现对H.265/HEVC的硬解支持

微帧Visionular

Docker常用命令原理与实战

Java-fenn

java;

一文带你弄懂Kubernetes应用配置管理时间

Java-fenn

java;

干货 | 一改测试步骤代码就全写?为什么不试试用 Yaml实现数据驱动?

霍格沃兹测试开发学社

详谈 MySQL 8.0 原子 DDL 原理

Java-fenn

Java

openGauss内核分析:SQL by pass & 经典执行器

Java-fenn

Java

python 基于aiohttp的异步爬虫实战时间

Java-fenn

Java

龙蜥开发者说:海纳百川,有容乃大,我在龙蜥社区的升级之旅 | 第 11 期

OpenAnolis小助手

开源 Linux内核 sig 龙蜥开发者说 epbf

让泛型的思维扎根在脑海——深刻理解泛型时间

Java-fenn

Java

Go 语言创始人:复制亿点点代码比用别人轮子好!

Java-fenn

java;

干货 | 仅需4步,即可用 Docker搭建测试用例平台 TestLink

霍格沃兹测试开发学社

这份数据安全自查checklist请拿好,帮你补齐安全短板的妙招全在里面!

Java-fenn

java;

Java 进阶 (八)Java 加密技术之对称加密、非对称加密、不可逆加密算法

Java-fenn

Java

内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档

Java-fenn

Java

从负载均衡到路由,微服务应用现场一键到位

Java-fenn

Java

干货 | H5性能分析实战来啦~

霍格沃兹测试开发学社

云对象 - 重新定义前后端交互

Java-fenn

Java

用了Fabric.js后突然想到了...

为自己带盐

实时音视频 Fabric.js 9月月更

C++ STL deque 容器底层实现原理(深度剖析)

C++后台开发

容器 后端开发 C++后台开发 C++开发 C++ STL

干货 | web自动化总卡在文件上传和弹框处理上?

霍格沃兹测试开发学社

【9.2-9.9】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

干货 | 一文搞定 uiautomator2 自动化测试工具使用

霍格沃兹测试开发学社

干货 | 初窥 Pytest 测试框架,基础薄弱也能轻松 hold 住

霍格沃兹测试开发学社

干货 | JavaScript脚本注入,完成Selenium 无法做到的那些事

霍格沃兹测试开发学社

干货 | Web自动化测试中显式等待与隐式等待该怎么用?

霍格沃兹测试开发学社

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