官术网_书友最值得收藏!

Programmatic lookup of contextual instances

We may encounter some situations where it's not convenient to obtain a contextual instance through injection, which are as follows:

  • Either the bean type or qualifiers of an injection point may vary at runtime
  • In some deployments, there may be no bean that satisfies the bean type and qualifiers of an injection point
  • We want to loop through all the beans of a specific bean type

For these situations we obtain an instance of Instance parameterized to the bean type we require:

@Inject
Instance<BookSearch> bookSearch;

To retrieve a contextual instance:

BookSearch search = bookSearch.get();

We can also alter the bean types that will be retrieved from Instance by adding qualifiers either to the injection point or passing them to select().

Specifying qualifiers at the injection is simple:

@Inject
@Book(Category.NONFICTION)
Instance<BookSearch> bookSearch;

But sometimes it's necessary for the qualifiers to be specified dynamically. For us to use dynamic qualifiers we need to suppress the @Default qualifier by specifying @Any on the injection point:

@Inject
@Any
Instance<BookSearch> bookSearch;

Now, we need to create an instance of our annotation @Book so it can be passed to select(). However, as it's just an interface we aren't able to create one with new, we need an implementation of that interface. CDI helps us out by providing AnnotationLiteral, a helper class for creating annotation implementations. Our annotation implementation is:

public class BookLiteral extends
AnnotationLiteral<Book> implements Book {
  private final Category category;
  private final String description;

  public BookLiteral(Category category, String description) {
    this.category = category;
    this.description = description;
  }

  public Category value() {
    return category;
  }

  public String description() {
    return description;
  }
}

So retrieving a bean from Instance with a dynamic qualifier is:

Annotation qualifier = fiction ? new BookLiteral(Category.FICTION,
"") : new BookLiteral(Category.NONFICTION, "Non Fiction");
BookSearch search = bookSearch.select(qualifier).get();

If we had separate qualifiers for fiction and nonfiction books, such as @NonFiction and @Fiction, instead of @Book with a Category, we could use dynamic qualifiers without extending AnnotationLiteral by creating anonymous classes:

bookSearch.select(new AnnotationLiteral<NonFiction>() {}).get();
Tip

"You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com . If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you."

主站蜘蛛池模板: 霍城县| 玛多县| 北票市| 河津市| 南木林县| 西贡区| 梁山县| 介休市| 宜君县| 黄骅市| 金华市| 巍山| 田林县| 秦皇岛市| 广东省| 沙湾县| 乐陵市| 鲁甸县| 宽城| 高尔夫| 论坛| 印江| 安徽省| 苍南县| 白朗县| 汝阳县| 东山县| 长治市| 拉萨市| 元氏县| 甘泉县| 新宾| 阿鲁科尔沁旗| 天全县| 凤冈县| 襄垣县| 庆安县| 新津县| 定南县| 安丘市| 天峨县|