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

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

阅读更多

如需转载,请注明出处,谢谢http://equalxx.iteye.com/

这次代码格式调整有点凌乱

 

Chapter 1.Introduction 介绍

你现在是不是特别想开始写你的第一个bean了?或者你很犹豫,不知道CDI规范有什么地方会很难。别急,其实你可能已经写过成千上百个bean了,CDI只是让你用它们更简单地创建一个应用!

 

1.1  what is a bean 什么是bean

bean就是你想的那样。也就现在它在容器环境中有了定义,在java EE 6之前,在javaEE平台上术语”bean”没有明确的定义。当然,我们已经把web和企业级应用里面的java类叫做bean很多年了。甚至在javaEE规范里有好几种不同的叫做bean的东西,这其中包括EJB beanJSF托管bean。同时,其他的第三方框架,比如SpringSeam,介绍了他们自己对bean的理解。我们缺一个官方公共定义。

 

最终Java EE 6Managed Bean规范中给出了bean的官方定义。Bean被定义为具有最小编程限制的容器管理对象,在某种情形下被称为POJOPlain Old Java Object)。他们提供少量基本服务,比如资源注入,生命周期回调,以及拦截器。这些规范,比如EJBCDI,都建立在此基础之上。但是,最终,这些bean和轻量级组件模型都会统一起来,在不同JavaEE平台上保持一致。

 

大多时候(除了很少的例外情形),构造器没有参数(或一个构造器被@Inject标注)的具体类被当做bean。这包括了所有的JavaBean和所有EJB会话BeanEJB Session Bean)。如果你已经写过JavaBeanEJBbean的话,相当于已经接触过bean了,不需要在此之上多添加什么特别的配置。你之前每天写的bean到目前为止还没有用到CDI规范里的新服务,但你现在可以试着利用CDI对任何一个bean进行操作:允许容器创建和销毁bean的实例,并将它们与指定的上下文相关联,将它们注入到其他bean中,在EL表达式中使用它们,用限定的注释去标注,甚至给他们添加拦截器和装饰器——这并不需要你修改现有的代码,最多就是加点注释。现在就让我们来创建你的第一个用CDI生成的bean吧。

 

1.2   Getting our feet wet 试水

 

假设我们有两个现有的Java类,我们已经在各种应用里用了很多年了。第一个类是把一个字符串转换成句子list

        

public class SentenceParser {
      public List<String> parse(String text) { ... }
}

 
 

 

第二个类是一个供外部系统前端调用的无状态会话bean,功能是将句子从一种语言翻译成另一种语言:

 

@Stateless
public class SentenceTranslator implements Translator {
      public String translate(String sentence) { ... }
}

 

 

其中TranslatorEJB本地接口:

 

@Local
public interface Translator {
public String translate(String sentence);
}

 

 

让我们写一个bean,翻译整个文本:

public class TextTranslator {
private SentenceParser sentenceParser;
private Translator sentenceTranslator;
@Inject
TextTranslator(SentenceParser sentenceParser, Translator sentenceTranslator) {
this.sentenceParser = sentenceParser;
this.sentenceTranslator = sentenceTranslator;
}
public String translate(String text) {
StringBuilder sb = new StringBuilder();
for (String sentence: sentenceParser.parse(text)) {
sb.append(sentenceTranslator.translate(sentence));
}
return sb.toString();
}
}

 

 

但等等,没有无参数构造器的TextTranslator是否仍然是个bean?如果你还记得的话,一个类没有无参构造器,但如果有@Inject注解的话,它仍然是个bean

 

正如你所想,@Inject和依赖注入有关!@Inject适用于bean的构造器或者方法,然后容器在初始化的时候调用这些构造器或者方法。容器也可以通过这些构造器和方法的参数来注入其他bean

 

我们可以获得TextTranslator的实例通过将其注入到一个bean构造函数、方法、域中,或是一个JavaEE组件类的域或方法(如servlet)。容器选择被注入的对象是通过注入地方的类型,而不是域、方法或者参数的名称。

 

让我们来创建一个通过域注入来获得TextTranslator实例的UI Controller bean吧,用来翻译用户输入的文本。

 

@Named @RequestScoped
public class TranslateController {
@Inject TextTranslator textTranslator;
private String inputText;
private String translation;
// JSF action method, perhaps
public void translate() {
translation = textTranslator.translate(inputText);
}
public String getInputText() {
return inputText;
}
public void setInputText(String text) {
this.inputText = text;
}
public String getTranslation() {
return translation;
}
}

 

 

小贴士:

注意这个Controller是被标注了request-scopednamed的。因为现在web应用里同时用这俩注释非常常见,所以CDI里有个内置的注解@Model,如果用了@Model,就相当于创建了一个@request-scope,@Named bean

 

另外,我们也可以通过编程方式用bean的类型作为参数,从一个被注入的实例的实例获取一个TextTranslator实例,语言说起来有点鸡肋,看代码吧:

import javax.enterprise.inject.Instance;
import javax.inject.Inject;
....
@Inject Instance<TextTranslator> textTranslatorInstance;
...
public void translate() {
textTranslatorInstance.get().translate(inputText);
}

 

 

请注意没必要为了把一个bean注入到另一个bean而去写gettersetter方法。CDI可以直接访问一个被注入的域(甚至它是私有的),这样可以少些无用代码。域的名字可以任意命名,它决定了什么会被注入。

 

在系统初始化期间,容器必须验证注入的类的存在。在我们的例子中,如果没有Translator的实现方法(如果SentenceTranslator EJB没有加载),容器会通知我们这里有个问题依赖(unsatisfied

dependency)。如果有多个Translator的实现类,容器会通知我们依赖模糊(ambiguous dependency)。

 

在我们深入细节以前,让我们先停下来检查一下bean的结构。bean的哪方面最重要,是什么让它最重要。所以与其给你看bean的例子,我们将要找出是什么组成了一个bean

 

如需转载,请注明出处,谢谢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