【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

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...