cdi

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实例
[java] view plain copy
  1. @Qualifier  
  2. @Target({TYPE,METHOD,FIELD,PARAMETER})  
  3. @Retention(RUNTIME)  
  4. public@interfaceSimple{  
  5. }  


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

qualifier
对于又显示的qualifier声明的,如上图qualifiers列表里面有声明的qualifier+Any。
所以说,@Default不要随便添加。

动态注入

组件的注入是用户在调用之后临时注入的。如下例子:

先将GreetingController通过注入的方式作为一个Bean,在用户选取的时候,容器临时通过调用该Bean,在注入task的时候,通过@Preferred找到如下方法来对task进行选择性注入。

  1. @Produces  
  2. @Preferred  
  3. @SessionScoped  
  4. publicTaskgetTask(AsyncTaskasynTack,SyncTack,asynTack){  
  5.     System.out.println("getTask called......");  
  6.     switch(taskType){  
  7.     caseASYNC:  
  8.       returnasyncTask;  
  9.     caseSYNC:  
  10.       returnsyncTask;  
  11.     default:  
  12.       returnnull;  
  13.     }  
  14. }  

 

 

组件的生命周期

@Named(=”XXXX”) 定义组件别名(类比于JSF)
(ApplicationScope、SessionSCope、RequestScope、Dependent)
或者只加@module时等价于加上了@named、@requestScope

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值