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;
- 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