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

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

主站蜘蛛池模板: 沅陵县| 长泰县| 武邑县| 灯塔市| 镇平县| 南城县| 馆陶县| 安龙县| 武威市| 乐业县| 苍山县| 大港区| 江陵县| 阿瓦提县| 武隆县| 庆安县| 汉中市| 湖北省| 青州市| 永寿县| 忻州市| 南召县| 玉山县| 梓潼县| 安新县| 龙南县| 大冶市| 高唐县| 乐平市| 沅江市| 綦江县| 遂平县| 金寨县| 从江县| 萍乡市| 互助| 新宾| 佳木斯市| 锡林郭勒盟| 上饶县| 铁岭县|