在JSF命名bean中注入Java对象

时间:2013-01-01 16:11:52

标签: jsf java-ee dependency-injection java-ee-6 cdi

我有一个JSF2 bean用作我的视图的控制器:

@Named
@SessionScoped
public class PosController implements Serializable {

  @EJB FatturaFacade fatturaFacade;

  // ...
}

正如您所看到的,我已经可以在其中注入我的一个EJB(用作dao包装器),但是注入“简单”对象的方式是什么?如果我有如下不同的实现怎么办?

interface Retriever;
class WebServiceRetriever implements Retriever;
class FileRetriever implements Retriever;

我看到@interface注释,但我不太了解它。

1 个答案:

答案 0 :(得分:3)

假设您拥有完整的Java EE 6平台,最好的方法是使用CDI的@Inject

最简单的机制是使用具体类型:

public class Bean {
  @Inject
  private WebServiceRetriever webServiceRetriever;

  @Inject
  private FilesRetriever filesRetriever;

  //etc.

对于同一界面的多个实现,您可以创建@Qualifier注释。它们的用法在Using Qualifiers section of the Java EE 6 tutorial中解释。

@Files限定符:

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Files {}

FileRetriever实施:

@Files
public class FileRetriever implements Retriever {}

消除注射目标中Retriever实施的消歧:

public class Bean {
  @Inject @WebServices
  private Retriever webServiceRetriever;

  @Inject @Files
  private Retriever filesRetriever;

  //etc.

我的博客using JSF with CDI上有一篇文章,您可能会发现它很有用。