CDI讲义详解(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kiss_The_sky/article/details/53036475


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{
}


具体的应用可以参考weld-tutorial/qualifiers
@Inject @Fancy Greeting greeting;

qualifier
对于又显示的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

展开阅读全文

没有更多推荐了,返回首页