- 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."
- Web程序設計及應用
- Java高并發核心編程(卷2):多線程、鎖、JMM、JUC、高并發設計模式
- C語言程序設計
- Kinect for Windows SDK Programming Guide
- Android底層接口與驅動開發技術詳解
- Spring Boot企業級項目開發實戰
- 焊接機器人系統操作、編程與維護
- Teaching with Google Classroom
- Access 2010中文版項目教程
- QlikView Unlocked
- Android Studio開發實戰:從零基礎到App上線 (移動開發叢書)
- 3D Printing Designs:The Sun Puzzle
- PHP動態網站開發實踐教程
- 美麗洞察力:從化妝品行業看顧客需求洞察
- H5匠人手冊:霸屏H5實戰解密