`
equalxx
  • 浏览: 65405 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

CDI框架笔记-weld reference中文翻译(三)

阅读更多

请尊重成果,如需转载请注明来源http://equalxx.iteye.com/

 

Chapter 2.More about beans关于bean的更多内容

 

bean一般是包含业务逻辑的应用类。可以直接被java代码调用,也可以在标准的EL表达式中调用。Bean也可以访问事务资源。Bean之间的依赖关系由容器自动管理,大多bean是有状态和上下文的。Bean的生命周期由容器管理。

 

让我们再看一下,到底什么叫“有上下文的”?bean有没有状态关系到我有哪个bean的实例。不像一个没有状态的组件模型(比如无状态会话bean)或是一个单例组件模型(比如servlets或是单例bean),有状态bean在不同的客户端有着不同的状态。是否标识用户可见状态(client-visible state)取决于客户端有没有对这个bean的实例的引用。

 

无状态或单例模型,不同于有状态会话bean,客户端不会通过显式地创建销毁它来控制它的生命周期。取而代之的是用bean scope来决定:

1、每个bean实例的生命周期

2、哪些客户端可以共享对bean的指定实例的引用

 

对于CDI应用的给定线程,可能会有一个通过bean scope关联的活动上下文。这个上下文在这个线程中可能是唯一的(比如这个beanrequest scoped的),或是它也可能同时与其他线程共享(比如这个beansession scoped的),甚至和所有其他线程共享(这用的是application scoped)。

 

执行在同一上下文中的客户端(比如说其他beans)用的都是同一个bean实例。但是在不同上下文中执行的客户端,用的是不同的实例(这取决于上下文之间的关系)。

 

上下文其中一项最大的优点就是它可以让状态beanservice一样。客户端不必去管理它的bean的生命周期,也不用知道bean的生命周期是什么。这些bean都是松耦合的,因为:

1、他们通过明确的公共API来管理相互间关系

2、它们的生命周期跟客户端完全解耦

 

我们可以把一个bean替换成继承同一个接口的另一个bean(这个bean可以有不同的生命周期(scope))而不用影响任何其他bean的实现。事实上,CDI提供了一个简单的方式在部署时重载,我们会在4.7节的“Alternatives”详细介绍。

 

要注意不是所有bean的客户端都是bean本身。其他对象,比如servlets或消息驱动beanmessage-driven beans),他们都不是可注入到其他bean的上下文对象,但他们仍然能够通过注入获取对其他bean的引用。

 

 

2.1. The anatomy of a bean bean的解析

 

在此前我们已经铺垫了这么多,下面我们来正式地介绍bean,根据规范:

一个bean由以下属性组成:

1、一个(非空)bean类型集

2、一个(非空)限定符集

3、一个Scope

4、可选,一个bean EL name

5、一组拦截器绑定

6、一个bean的实现

此外,一个bean可能是alternativ的,也可能不是。

让我们去看看这些属性都是什么意思。

 

2.1.1 Bean typesqualifiers and dependency injection bean类型,限定符和依赖注入

 

Bean通常通过依赖注入获取对其他bean的引用。任何一个被注入的属性规定了一个“合同”,所有要注入的bean必须满足这个“合同”。这个“合同”就是:

1、bean type

2、一组限定符

bean type表明了bean是用户可见类型,它可以是用户定义的class或接口。如果bean是个EJB会话bean,那么它的bean type就是@Local接口,或是bean-class的本地视图。一个bean可能会有很多个bean type。比如说下面的bean有四个bean type

 

public class BookShop
extends Business
implements Shop<Book> {
...
}

 

 

它的bean type BookShopBusinessShop<Book>,以及隐式类型java.lang.Object(注意,参数化类型是合法的bean类型)。

 

同时,下面这个会话bean只有本地的三个接口BookShopAuditablejava.lang.Object可以作为bean type,但由于@StatefulBookShopBean不是用户可见类型。

 

@Stateful
public class BookShopBean
extends Business
implements BookShop, Auditable {
...
}

 

 

注意:会话beanbean type包括本地接口和beanlocal view(如果有的话)。EJB远程接口不被认为是会话beanbean type。你不能把一个EJB通过远程接口注入,除非你定义一个资源,这个会在Chapter 14Java EE组件环境资源中介绍。

 

(译者注:其实这段光看英文感觉难以和实际使用关联起来,bean type到底讲了什么,查看了一些资料以后我认为可能是在说,bean通过可以通过不同的bean type注入,而bean type包含了什么内容,有个网址里面有说明http://moon26.blogspot.jp/2012/01/javaee6-cdi-bean-and-bean-types.html,我会接下来和同事一起讨论,它究竟在开发中处于什么角色,再来更新此部分内容)

 

Bean types可以通过@Typed注解来指定,同时列出所有应该为bean type的类。比如说这个bean types bean已经被限制为Shop<Book>java.lang.Object

 

@Typed(Shop.class)
public class BookShop
extends Business
implements Shop<Book> {
...
}

 

 

有时,仅有bean type的话并不能提供给容器足够的信息去让容器知道该注入哪个bean。举例说,假设我有两个实现了PaymentProcessor接口的实现类:CreditCardPaymentProcessorDebitPaymentProcessor。如果把它俩注入到PaymentProcessor类型的域中,就会引起混淆。在这种情况下,用户必须提供更多的特性来告知容器应该注入哪一个。所以我们通过qualifier来指明特性。

 

一个qualifier是个用户定义的注解,用@Qualifier来定义。它是一个类型系统(type system)的一个扩展。它使我们不用基于名称来区分注入类型。以下就是个用@Qualifier注解的例子:

 

@Qualifier
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RUNTIME)
public @interface CreditCard {}

 

 

 

你可能还不习惯看到上面这样的创建注解的代码,有可能这是你第一次遇到这样定义。用CDI的话,定义注解将会成为你时不时需要去做的事儿。

 

注意:

请注意在CDIEJB中的注解名称,你会发现他们多是形容词。我们鼓励您在创建自定义注解时候也遵循这种习惯,当它们是用来描述行为和指明类角色的时候。

 

现在我们已经定义了一个特性注解了,我们可以在注入点使用它来明确注入类。下面的注入点包含了bean类型PaymentProcessor以及qualifier @CreditCard

 

@Inject @CreditCard PaymentProcessor paymentProcessor

 

 

注意:

若一个bean或是一个注入点没有被一个qualifier修饰,它会有一个默认修饰符@Default

 

 

这还没结束,CDI还定义了一个简单的解决规则用来帮助容器该接下来怎么做,当多个bean同时满足“合同”的时候。我们会在Chapter 4,依赖注入和程序化查找章节讨论细节。

 

请尊重成果,如需转载请注明来源http://equalxx.iteye.com/

0
1
分享到:
评论

相关推荐

    cdi-api-1.0-sources.jar

    cdi-api-1.0-sources.jarcdi-api-1.0-sources.jarcdi-api-1.0-sources.jar

    cdi-api-2.0.SP1.jar

    CDI (以前称为JSR 299)是一种尝试描述依赖注入的真实标准的尝试。 乍一看,CDI的吸引力在于SpringSource和Google都参与了规范团队。 CDI是Java EE 6堆栈的一部分,这意味着在Java EE 6兼容容器中运行的应用程序...

    cdi-api-1.1

    cdi-api-1.1 &lt;name&gt;CDI APIs &lt;description&gt;APIs for CDI (Contexts and Dependency Injection for Java EE) &lt;url&gt;http://www.seamframework.org/Weld&lt;/url&gt;

    pax-cdi-web-openwebbeans-0.7.0.zip

    PAX CDI是一个用于OSGi环境的CDI(Contexts and Dependency Injection)实现,它是Java EE的轻量级依赖注入框架。OpenWebBeans是Apache组织提供的另一个CDI实现,它专注于轻量级、高性能和可扩展性。在本项目中,这...

    cdi-tck-ext-lib-1.2.0.Beta1.zip

    任何CDI的实现,如Weld、OpenWebBeans等,都需要通过TCK测试以确保其兼容性。"EXT-LIB"可能指的是这个测试套件包含了一些扩展库,用于测试特定的CDI扩展功能。 3. **Java SDK(Software Development Kit)**:Java ...

    cdi-tck-api-1.1.0.Beta2.zip

    【标题】"cdi-tck-api-1.1.0.Beta2.zip" 提供的是CDI(Contexts and Dependency Injection)技术规范测试工具包(Test Compatibility Kit)的API,这是Java EE平台中的一个核心组件,用于管理组件的生命周期和依赖...

    德力西CDI9100-S变频器说明书(英文).pdf

    德力西CDI9100-S系列变频器是杭州德力西逆变器有限公司制造的产品。该设备的使用说明书对于确保设备的正确应用至关重要。在使用变频器之前,务必仔细阅读说明书,因为不正确的操作可能导致设备运行异常、故障、服务...

    pax-cdi-extension-0.4.0.zip

    CDI是一种在Java EE应用中管理和注入依赖关系的框架,它简化了组件之间的交互,增强了代码的可测试性和可维护性。 【描述】"ais-commons-application.zip" 提供了一个名为"AIS Commons Application"的库,这个库是...

    bean-validator-cdi-2.2.0-b23.zip

    在Java开发领域,Bean Validation和Context Dependency Injection(CDI)是两个重要的技术框架,它们为应用程序提供了强大的数据验证和依赖注入功能。这里我们将深入探讨的是Bean Validator 2.2.0-b23版本与CDI的...

    cdi-api-1.0.jar

    CDI(Contexts and Dependency Injection 上下文依赖注入),是JAVA官方提供的依赖注入实现,可用于Dynamic Web Module中

    errai-cdi-jetty-2.4.2.Final.zip

    【标题】"errai-cdi-jetty-2.4.2.Final.zip" 提供的是一个集成Errai CDI框架与Jetty服务器的版本。这个压缩包中的内容可能包括了Errai CDI库的源码、相关的配置文件以及用于运行Jetty服务器的脚本和依赖。Errai CDI...

    cdi-api-1.0-SP1.jar

    java运行依赖jar包

    jooq-cdi-codegen-2.2.zip

    标题中的"jooq-cdi-codegen-2.2.zip"指的是JOOQ(Java Object Oriented Querying)的一个特定版本,2.2,与CDI(Contexts and Dependency Injection)集成的代码生成器。JOOQ是一个用于Java的SQL库,它允许直接在...

    cdi-weld:焊接CDI简介

    CDI-上下文和依赖注入 内容: 资源和材料 ↑ 介绍 多年来,程序员已经编写了使用众所周知的new关键字创建对象的代码。 随着时间的流逝,程序变得越来越复杂,维护繁琐的创建逻辑变得越来越困难,同时又保持了代码...

    bean-validator-cdi-2.2.0-b25.zip

    【标题】"bean-validator-cdi-2.2.0-b25.zip" 是一个与Java Bean验证和CDI(Contexts and Dependency Injection)相关的开源项目。这个版本号2.2.0-b25表明它是该项目的第二个主要版本的第25个次要修正版。Bean验证...

Global site tag (gtag.js) - Google Analytics