3

我有一个 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注释,没看懂。

4

1 回答 1

3

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

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

public class Bean {
  @Inject
  private WebServiceRetriever webServiceRetriever;

  @Inject
  private FilesRetriever filesRetriever;

  //etc.

对于同一接口的多个实现,您可以创建@Qualifier注释。Java EE 6 教程的使用限定符部分解释了它们的用法。

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

我的博客上有一篇关于将 JSF 与 CDI 结合使用的文章,您可能会发现它很有用。

于 2013-01-01T17:12:14.413 回答