【Java EE】--Contexts and Dependency Injection (上下文与依赖注入)05

前端之家收集整理的这篇文章主要介绍了【Java EE】--Contexts and Dependency Injection (上下文与依赖注入)05前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Giving Beans EL Names

要通过EL访问bean,请使用@Named内置限定符:

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@RequestScoped
public class Printer {

    @Inject @Informal Greeting greeting;
    ...
}

@Named限定符允许您使用bean名称访问bean,第一个字母以小写形式。 例如,Facelets页面将该bean称为打印机。

您可以为@Named限定符指定一个参数以使用非默认名称

@Named("MyPrinter")

使用此注释,Facelets页面将该bean称为MyPrinter。

添加Setter和Getter方法

要使托管bean的状态可访问,您需要为该状态添加setter和getter方法。 createSalutation方法调用bean的greet方法,getSalutation方法检索结果。

一旦添加了setter和getter方法,bean就完成了。 最终的代码如下所示:

package greetings;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@RequestScoped
public class Printer {

    @Inject @Informal Greeting greeting;

    private String name;
    private String salutation;

    public void createSalutation() {
        this.salutation = greeting.greet(name);
    }

    public String getSalutation() {
        return salutation;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

在Facelets页面中使用托管Bean

要在Facelets页面中使用托管bean,您通常会创建一个使用用户界面元素调用方法显示其结果的窗体。 此示例提供了一个按钮,要求用户键入名称,检索称呼,然后在按钮下方的段落中显示文本:

<h:form id="greetme">
   <p><h:outputLabel value="Enter your name: " for="name"/>
      <h:inputText id="name" value="#{printer.name}"/></p>
   <p><h:commandButton value="Say Hello" action="#{printer.createSalutation}"/></p>
   <p><h:outputText value="#{printer.salutation}"/></p>
</h:form>

使用生产者方法注入对象

生产者方法提供了一种方法来注入不是bean的对象,其值可能在运行时变化的对象以及需要自定义初始化的对象。 例如,如果要初始化由名称为@MaxNumber的限定符定义的数值,可以在托管bean中定义值,然后为其定义生成方法getMaxNumber:

private int maxNumber = 100;
...
@Produces @MaxNumber int getMaxNumber() {
    return maxNumber;
}

当您将对象注入另一个托管的bean时,容器将自动调用生成方法,将该值初始化为100:

@Inject @MaxNumber private int maxNumber;

如果值在运行时可能会有所不同,则过程略有不同。 例如,以下代码定义了一个生成方法,该方法生成由限定符@Random定义的随机数:

private java.util.Random random = 
    new java.util.Random( System.currentTimeMillis() );

java.util.Random getRandom() {
        return random;
}

@Produces @Random int next() {
    return getRandom().nextInt(maxNumber);
}

当您将此对象注入另一个托管的bean时,您将声明对象的上下文实例:

@Inject @Random Instance<Integer> randomInt;

然后调用实例的get方法

this.number = randomInt.get();

配置CDI应用程序

当您的bean使用范围类型进行注释时,服务器将应用程序识别为bean归档,并且不需要其他配置。
CDI使用名为beans.xml的可选部署描述符。 与其他Java EE部署描述符一样,除了CDI类中的注释设置之外,还使用beans.xml中的配置设置。 如果有冲突,beans.xml中的设置会覆盖注释设置。 存档必须仅在某些有限的情况下包含beans.xml部署描述符,
对于Web应用程序,beans.xml部署描述符(如果存在)必须位于WEB-INF目录中。 对于EJB模块或JAR文件,beans.xml部署描述符(如果存在)必须位于Meta-INF目录中。

End

猜你在找的设计模式相关文章