国内精品久久久久久久星辰影视-亚洲天堂久久精品成人-亚洲国产成人综合青青-91精品啪在线看国产网站-日韩一区二区在线观看

?
    開(kāi)發(fā)技術(shù) / Technology

    Java EE CDI 依賴(lài)注入 (@Inject) 教程

    日期:2015年2月25日  作者:zhjw  來(lái)源:互聯(lián)網(wǎng)    點(diǎn)擊:714

    在本教程中,你將會(huì )學(xué)到幾種不同的方法,用@Inject注解來(lái)實(shí)現Java EE CDI方式的依賴(lài)注入。

     

    1. 簡(jiǎn)介

    Java EE CDI 主要使用@Inject注解來(lái)實(shí)現依賴(lài)注入,把受管理的bean注入到由容器管理的其它資源中去。在本教程中,我們將會(huì )介紹在CDI環(huán)境下幾種不同的可選策略來(lái)實(shí)現依賴(lài)注入。

    本教程基于如下環(huán)境:

    1. JDK 1.7.0.21
    2. Weld 1.1.10

    Weld 是CDI 的參考實(shí)現。

    2. 構造器依賴(lài)注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class SomeBean {
       
      private final Service service;
     
      @Inject
      public SomeBean(Service service){
        this.service = service;
      }
     
    }

    當CDI容器在初始化一個(gè)SomeBean類(lèi)型的bean實(shí)例時(shí),它將會(huì )查找該類(lèi)的默認構造器(無(wú)參構造器)并用它來(lái)創(chuàng )建bean實(shí)例。但是有一個(gè)例外情況,就是當我們還有一個(gè)使用@Inject 進(jìn)行了注解的構造器時(shí),這種情況下,容器會(huì )改用有注解的構造器而不是無(wú)參構造器,并且把通過(guò)構造器參數傳入的依賴(lài)資源注入到bean實(shí)例中來(lái)。

    在上面的例子中,容器將會(huì )獲取到一個(gè)Service 的實(shí)例并把它注入到SomeBean 的注解構造器中.

    注意: 記住一個(gè)類(lèi)只允許有 一個(gè)@Inject注解的構造器。
     

    3. 字段依賴(lài)注入

    1
    2
    3
    4
    5
    6
    public class SomeBean {
       
      @Inject
      private Service service;
     
    }

    這種情況下,當容器初始化一個(gè) SomeBean類(lèi)型的bean時(shí),它會(huì )把一個(gè)正確的Service實(shí)例注入給該字段,即使該字段是一個(gè)私有字段,并且不需要有任何setter方法。

    4. 初始化方法依賴(lài)注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class SomeBean {
       
      private Service service;
       
      @Inject
      public void setService(Service service) {
        this.service = service;
      }
     
    }

    這種情況下,當容器初始化一個(gè) SomeBean類(lèi)型的bean時(shí),它會(huì )調用所有由@Inject注解了的方法,并且通過(guò)方法參數的方式把依賴(lài)注入進(jìn)來(lái)。

    5.  @Any 修飾符

    為了提供完全松耦合的應用,我們通常把接口注入到受管理的資源中。當我們有多個(gè)實(shí)現了給定接口的bean時(shí)該怎么辦呢?我們可以同時(shí)使用@Any修飾符和CDI的Instance接口,來(lái)把所有該接口的實(shí)現bean都注入進(jìn)一個(gè)受管理的bean中:

    The @Any qualifier
    1
    2
    3
    4