<code id="qf3hh"></code>
  • <menuitem id="qf3hh"></menuitem>
  • <strike id="qf3hh"><label id="qf3hh"></label></strike>

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

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

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

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

       

      1. 簡介

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

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

      1. JDK 1.7.0.21
      2. Weld 1.1.10

      Weld 是CDI 的參考實現(xiàn)。

      2. 構(gòu)造器依賴注入

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

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

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

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

      3. 字段依賴注入

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

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

      4. 初始化方法依賴注入

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

      這種情況下,當(dāng)容器初始化一個 SomeBean類型的bean時,它會調(diào)用所有由@Inject注解了的方法,并且通過方法參數(shù)的方式把依賴注入進來。

      5.  @Any 修飾符

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

      The @Any qualifier