CDI在创建对象时与正常方式的不同之处
eg:
puclic class Dog extends Animal interface Attack{}
在正常情况下创建一个dog对象我们可以:
但是应该优先考虑层级性最低级的,所以说,应该考虑后两种方式.
在CDI容器中,,所有的Java对象都是组件,在应用对象时通过依赖注入的方式向容器索取对象。
组件的基本要求:定义无参构造方法的 Java 类 包括:
- javabean
- EJB session bean/Message Bean
- JSF ManagedBean
Weld在应用启动时自动扫描所有的 class 文件,符合条件的 java 对象都收入“对象库”
组件的依赖注入
- @Inject Greeting greeting
- @RequestScoped
@Inject的作用就是向容器索取一个类型为Greeting的对象,而Greeting就是一个qualifier,对于一个没人为添加其他注解的组件,有两个默认的qualifier——@Any、@Default。
qualifier的作用及其引入
帮助进一步澄清组件的类型:当依靠组件自身的类型无法
唯一确定组件时,需要定义额外的 qualifier 一起联合限定组件,
另外在定义qualifier的时候,最好是用形容词,不要绑定到特定场景。
一个qualifier实例
- @Qualifier
- @Target({TYPE,METHOD,FIELD,PARAMETER})
- @Retention(RUNTIME)
- public@interfaceSimple{
- }
- @Qualifier
- @Target({TYPE,METHOD,FIELD,PARAMETER})
- @Retention(RUNTIME)
- public@interfaceSimple{
- }
具体的应用可以参考weld-tutorial/qualifiers
@Inject @Fancy Greeting greeting;
对于又显示的qualifier声明的,如上图qualifiers列表里面有声明的qualifier+Any。
所以说,@Default不要随便添加。
动态注入
组件的注入是用户在调用之后临时注入的。如下例子:
先将GreetingController通过注入的方式作为一个Bean,在用户选取的时候,容器临时通过调用该Bean,在注入task的时候,通过@Preferred找到如下方法来对task进行选择性注入。
- @Produces
- @Preferred
- @SessionScoped
- publicTaskgetTask(AsyncTaskasynTack,SyncTack,asynTack){
- System.out.println("getTask called......");
- switch(taskType){
- caseASYNC:
- returnasyncTask;
- caseSYNC:
- returnsyncTask;
- default:
- returnnull;
- }
- }
组件的生命周期
@Named(=”XXXX”) 定义组件别名(类比于JSF)
(ApplicationScope、SessionSCope、RequestScope、Dependent)
或者只加@module时等价于加上了@named、@requestScope