写点什么

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

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

关注

评论

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

不愧是字节跳动技术官,算法精髓全写这本666页笔记里了

Java架构追梦

Java 程序员 数据结构与算法、

Stack 顿悟三部曲(1):从CPU的视角说起

蓬蒿

cpu 堆栈 计算机原理 stack

耗时三年终于整理出了SSM+微服务+Nginx+Redis+MySQL的PDF了!

Java架构追梦

Java 后端开发

2021-11-9【数据结构平时实验】

爱好编程进阶

Java 程序员 后端开发

2年工作经验的Java程序员面试经历

爱好编程进阶

程序员 后端开发

4年JAVA外包终上岸,我只能说避雷这些公司

爱好编程进阶

Java 程序员 后端开发

(JavaSE)数据类型变量与运算符

爱好编程进阶

Java 程序员 后端开发

区块链 重塑不良资产互信机制

CECBC

13-注解增删改查

爱好编程进阶

Java 程序员 后端开发

15 个优秀开源的 Spring Boot 学习项目,一网打尽!

爱好编程进阶

Java 程序员 后端开发

What?构造的查询语句会导致堆栈溢出

华为云开发者联盟

neo4j 图数据库 堆栈溢出 查询语句 查询语言

显卡只是为游戏而生吗?GPU服务器了解一下

Finovy Cloud

GPU服务器 GPU算力

2021全网最全Activiti7教程02(Activiti7入门使用-欢迎收藏)

爱好编程进阶

Java 程序员 后端开发

7Z命令行

爱好编程进阶

Java 程序员 后端开发

内存不超过5M,datop 在识别冷热内存及跨 numa 访存有多硬核?| 龙蜥技术

OpenAnolis小助手

cpu 内存 datop 轻量级 muma

Apache ShardingSphere 企业行|走进汽车之家

SphereEx

数据库 企业 ShardingSphere SphereEx apache 社区

快来跟20年京东T9架构师学习进阶微服务+Docker+Dubbo+SpringBoot

Java架构追梦

spring java面试 后端开发

微服务实战文档分享,阿里内部的Spring cloud微服务精髓都在里面

Java架构追梦

Java 微服务 阿里

终于有人把tomcat讲清楚了!阿里大牛推荐的tomcat架构解析文档

Java架构追梦

Java 后端开发 JVM’

云图说 | 华为云医疗智能体EIHealth,AI赋能基因组研究

华为云开发者联盟

华为云 云图说 EIHealth 医疗智能体 基因组

维权思考

成周

2021年4月23号,成功斩获阿里(Java岗

爱好编程进阶

Java 程序员 后端开发

BATJ关于Redis的高频面试真题

爱好编程进阶

Java 程序员 后端开发

[Day36]-[二叉树]-在每个树行中找最大值

方勇(gopher)

LeetCode 二叉树 数据结构算法

OpenHarmony 3.1 Beta版本关键特性解析——分布式DeviceProfile

OpenHarmony开发者

OpenHarmony OpenHarmony 3.1 Release DeviceProfile

动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路

华为云开发者联盟

stm32 RC522射频卡模块 IC卡 RC522

《数字经济全景白皮书》Z世代用户洞察篇 完整版 发布

易观分析

Z世代

架构师成长路线

AI架构师汤师爷

软件架构 架构师 成长路线

让 Rust 的 CI 加速 2~3倍速度

非凸科技

rust 构建 cl cithub 缓存空间

元宇宙核心技术--脑机接口

CECBC

BAT华为等一线大厂Java工程师必读书单

爱好编程进阶

Java 程序员 后端开发

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