- JBoss Weld CDI for Java Platform
- Ken Finnegan
- 377字
- 2021-08-13 16:49:56
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."
- C程序設計簡明教程(第二版)
- 數字媒體應用教程
- Python量化投資指南:基礎、數據與實戰
- 造個小程序:與微信一起干件正經事兒
- Access 數據庫應用教程
- HTML5+CSS3基礎開發教程(第2版)
- 基于Java技術的Web應用開發
- Mastering PHP Design Patterns
- Learn Swift by Building Applications
- Building Mobile Applications Using Kendo UI Mobile and ASP.NET Web API
- Learning Concurrency in Kotlin
- Python從入門到精通
- Java程序設計與項目案例教程
- Advanced UFT 12 for Test Engineers Cookbook
- C語言程序設計