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

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

Giving Beans EL Names

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

  1. import javax.enterprise.context.RequestScoped;
  2. import javax.inject.Inject;
  3. import javax.inject.Named;
  4.  
  5. @Named
  6. @RequestScoped
  7. public class Printer {
  8.  
  9. @Inject @Informal Greeting greeting;
  10. ...
  11. }

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

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

  1. @Named("MyPrinter")

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

添加Setter和Getter方法

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

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

  1. package greetings;
  2.  
  3. import javax.enterprise.context.RequestScoped;
  4. import javax.inject.Inject;
  5. import javax.inject.Named;
  6.  
  7. @Named
  8. @RequestScoped
  9. public class Printer {
  10.  
  11. @Inject @Informal Greeting greeting;
  12.  
  13. private String name;
  14. private String salutation;
  15.  
  16. public void createSalutation() {
  17. this.salutation = greeting.greet(name);
  18. }
  19.  
  20. public String getSalutation() {
  21. return salutation;
  22. }
  23.  
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27.  
  28. public String getName() {
  29. return name;
  30. }
  31. }

在Facelets页面中使用托管Bean

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

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

使用生产者方法注入对象

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

  1. private int maxNumber = 100;
  2. ...
  3. @Produces @MaxNumber int getMaxNumber() {
  4. return maxNumber;
  5. }

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

  1. @Inject @MaxNumber private int maxNumber;

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

  1. private java.util.Random random =
  2. new java.util.Random( System.currentTimeMillis() );
  3.  
  4. java.util.Random getRandom() {
  5. return random;
  6. }
  7.  
  8. @Produces @Random int next() {
  9. return getRandom().nextInt(maxNumber);
  10. }

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

  1. @Inject @Random Instance<Integer> randomInt;

然后调用实例的get方法

  1. 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

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