php cdi
让我们看一下CDI中的开箱即用的限定词
CDI规范声明了三个限定符– @ Any,@ Default,@ New
- @Any :将其视为无所不在的限定词。 它在那里,即使不是;-)
- @Default :顾名思义,当没有其他限定符时,该限定符将被视为默认限定符。 此规则的唯一例外是同时使用@Named(javax.inject)限定符
- @New :用于按需获取bean的新实例。 新实例是与范围无关的。 自CDI 1.1起不推荐使用
以下是一些简单的示例:
Bean(类)级别的预选赛
//Explicit qualifier not specified, hence @Default is assumedpublic class CSVParser implements Parser{
//implementation ...
}//Explicit qualifier specified@XMLParser
public class XMLParser implements Parser{
//implementation ...
}
注射点预选赛
public class ParsingService{@InjectParser parser //an implementation of the CSVParser class is injected (default behavior)//business logic
}public class ParsingService{@Inject@XMLParserParser parser //an implementation of the XMLParser class is injected//business logic
}
@Any有什么特别之处?
如前所述,@ Any限定符无处不在,即无论如何它始终存在。 有趣的是,如果您明确提及此批注,它将打开以下选项
- 您可以访问Bean的所有可能的实现
public class ParsingService{@Inject@AnyInstance<Parser> parsers; //javax.enterprise.inject.Instance handles the magic behind the scenespublic void availableParsingOptions(){for(Parser parser : parsers){System.out.println("Parser implementation class: "+ parser.getConcreteImplName());System.out.println("Supported format: "+ parser.getSupportedFormat().getName());}} }
- 它不会抑制默认bean(如果有)或任何显式(合格)实现。 您仍然可以动态查看它们(在运行时)
public class ParsingService{@Inject@AnyInstance<Parser> parsers;public Parser chooseParser(){//@XMLParser (qualifier annotation) being enforced programmaticallyParser selected = parsers.select(new XMLParserQualifier()).get();return (selected.isUnsatisfied() || selected.isAmbiguous()) ? null : selected;}//javax.enterprise.util.AnnotationLiteral project qualifiers as objectsprivate static class XMLParserQualifier extends AnnotationLiteral<XMLParser> implements XMLParser{} }
这就是快速使用默认CDI限定符的全部。 您可能想查看我之前有关CDI中自定义限定词基础的文章之一
干杯!
翻译自: https://www.javacodegeeks.com/2015/09/native-cdi-qualifiers-any-and-default.html
php cdi