java中di_3.2 Java中标准化的DI

从2004年开始,有几个用于依赖注入的IoC容器得到了广泛的应用(仅以Spring、Guice和PicoContainer为例)。曾几何时,它们在DI的配置方式上仍然各自为政,这使开发人员很难在不同框架之间迁移。

这一问题直到2009年5月才出现转机,DI社区的两大巨头Bob Lee(Guice)和Rod Johnson(SpringSource)宣布要齐心协力,共同打造一组标准的接口注解1。他们紧接着提出了JSR-330(javax.inject)规范请求,倡导Java SE的DI标准化。DI社区的各路诸侯纷纷响应,全部表示支持。

1 Bob Lee,“Announcing @javax.inject.Inject”(2009-05-08),www.theserverside.com/news/thread.tss?thread_id=54499。

Java EE中的DI标准化情况如何?

Java企业应用从JEE 6开始构建了自己的依赖注入体系(即CDI),由JSR-299(Java EE平台中的上下文及依赖注入)规范确定,你可在http://jcp.org/中搜索JSR-299了解其详细信息。简言之,JSR-299构建在JSR-330基础之上,旨在为企业应用提供标准化的配置。2

2 JSR-299(Java Contexts and Dependency Injection)目前由Redhat的Gavin King(Hibernate的创建者)主导,因为它比较新,所以设计理念上解决了以前DI框架中的一些问题,而且也不是非得在Java EE容器上才能使用,在Servlet容器上也可以使用。其参考实现为weld,详情请参见官网:http://www.seamframework.org/Weld。——译者注

自从javax.inject出现在Java中(Java SE 5、6和7都支持)以来,代码中就可以使用标准的依赖注入了,也可以在不同的DI框架中进行迁移。比如,你原来在轻量级的Guice框架中运行的代码,为了利用其丰富的特性,也可以迁移到Spring框架中去。

警告 实际上,代码迁移并不容易。一旦你的代码用到了仅由特定DI框架支持的特性,就不太可能摆脱这一框架了。尽管javax.inject包提供了常用DI功能的子集,但是你可能需要使用更高级的DI特性。正如你想象的那样,对于哪些特性应该作为通用的标准也是众说纷纭,很难统一。虽然现状不尽如人意,但Java毕竟朝DI框架的标准化方向迈出了一步。

为了理解最新的DI框架如何应用新标准,我们需要对javax.inject包进行一番研究。记住,javax.inject包只是提供了一个接口和几个注解类型,这些都会被遵循JSR-330标准的各种DI框架实现。也就是说,除非你在创建与JSR-330兼容的IoC容器(如果如此,向你致敬),通常不用自己实现它们。

我为什么要知道这东西怎么工作?

优秀的Java开发人员不能满足于只作为类库和框架的使用者,还要明白其内部的基本工作原理。在DI领域,不理解其原理可能会面临各种难缠的问题,比如依赖项配置错误、依赖项诡异地超出作用域、依赖项在不该共享时被共享以及分步调试离奇宕机等。

javax.inject的文档对这个包的目的做出了精彩的解释,所以我们全盘照搬过来了:

javax.inject包 3

这个包指明了获取对象的一种方式,与传统的构造方法、工厂模式和服务定位器模式(比如JNDI)等相比,这种方式的可重用性、可测试性和可维护性都得到了极大提升。这种方式称为依赖注入,对于大多数非小型应用程序都很有帮助。

javax.inject包里包括一个Provider接口和5个注解类型(@Inject、@Qualifier、@Named、@Scope和@Singleton),后续章节中会逐一对它们进行介绍。先从@Inject开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值