硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

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

关注

评论

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

追光动画《杨戬》:水墨、石窟、洛神赋,中式美感背后有中国云计算

B Impact

netty原理分析

小小怪下士

Java 编程 程序员 后端 Netty

35岁程序员自荐:我所掌握的架构技术

小小怪下士

Java 程序员 中年危机

英特尔Wi-Fi 7速率提升5倍,为多应用场景带来改变

科技之家

【网络安全】记一次简单渗透测试实战

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞利用

Vue3-无限滚动的懒加载-本地数据操作版

Sam9029

Vue 前端 懒加载 9月月更

【存疑】爬虫学习中decode问题

Sher10ck

存疑

Vue3-无限滚动的懒加载-模拟网络请求Mock版

Sam9029

Vue 前端 9月月更 无限滚动

Docker镜像列表中的none:none是什么

程序员欣宸

Docker 9月月更

长安链ca 容器部署(解决无法访问Mysql问题)

长安链

架构师成长之路——什么是架构师

小小怪下士

Java 程序员 架构 后端

【数据结构】利用Python手把手带你自定义矩阵

迷彩

数据结构 矩阵 矩阵运算 9月月更 自定义矩阵

经久不衰的设计定律是不要让我思考的设计

宇宙之一粟

读书笔记 设计 设计思维 设计原则 9月月更

汽车总线系统

不脱发的程序猿

汽车电子 CAN总线 汽车总线系统

Java基础科普

吉师职业混子

9月月更

从0开始的计算机之路

吉师职业混子

9月月更

开发者有话说|谈谈自己大学期间的收获,以及毕业的求职经历

芯动大师

个人成长 成长路上的思考 初心不变

为什么Java中有三种基础的类加载器?

小小怪下士

Java 编程 程序员 程序

大数据调度平台Airflow(六):Airflow Operators及案例

Lansonli

airflow 9月月更

Java | extends关键字【面向对象的第二大特征——继承】

Fire_Shield

Java 9月月更 extends

数字化办公,企业OA软件技术该如何发力?

FinClip

这样Debug,排查问题效率大大提升...

程序知音

前端面试哪些是必须要掌握的

loveX001

JavaScript 前端

网安超基础一周目

吉师职业混子

9月月更

基于微信小程序的会议室预定平台开发笔记

CC同学

设计模式和七大设计原则不难的

知识浅谈

设计模式 设计原则 9月月更

成为优秀程序员的8种方法

小小怪下士

Java 程序员 职业发展

Qt|制作简单的不规则窗体

中国好公民st

qt 事件 9月月更

PipyJS - 函数式网络编程语言

Flomesh

Service Mesh 服务网格

Java 面试之技术框架

小小怪下士

Java spring 编程 程序员

Lua脚本在Redis事务中的应用实践

京东科技开发者

数据库 redis 事务 开发语言 Lua脚本

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