1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. Java EE CDI方式的依賴(lài)注入方法

        時(shí)間:2020-10-01 15:10:29 J2EE培訓(xùn) 我要投稿

        Java EE CDI方式的依賴(lài)注入方法

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

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

          JDK 1.7.0.21

          Weld 1.1.10

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

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

          public class SomeBean {

          private final Service service;

          @Inject

          public SomeBean(Service service){

          this.service = service;

          }

          }

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

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

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

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

          public class SomeBean {

          @Inject

          private Service service;

          }

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

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

          public class SomeBean {

          private Service service;

          @Inject

          public void setService(Service service) {

          this.service = service;

          }

          }

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

          @Any 修飾符

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

          The @Any qualifier

          public class SomeBean {

          @Inject

          public void listServiceImplementations(

          @Any Instance serviceList) {

          for(Service service : serviceList){

          System.out.println(service.getClass().getCanonicalName());

          }

          }

          }

          @Any 修飾符告訴容器,任何可供使用的依賴(lài)都適用于該注入點(diǎn),所以容器會(huì)把他們都注入進(jìn)來(lái)。 如果我們有接口的多個(gè)實(shí)現(xiàn)而我們只注入其中的一個(gè) - 并且沒(méi)有做任何排除工作 - 那么容器將會(huì)抱怨并且無(wú)法成功的初始化組件。我們將會(huì)在其他教程中介紹依賴(lài)排除問(wèn)題。

          6.注入到生產(chǎn)者方法中

          生產(chǎn)者方法的參數(shù)也可以經(jīng)由CDI容器進(jìn)行注入。請(qǐng)查看Java EE CDI Producer methods tutorial.

          7. CDI 代理

          如果我們不涉及CDI代理機(jī)制,那么本教程將是不完整的。當(dāng)我們把一個(gè)在不同于@Dependent范圍下創(chuàng)建出來(lái)的bean注入到另外一個(gè)托管資源時(shí),CDI容器不會(huì)注入一個(gè)被注入bean的直接引用。

          CDI 中bean 的范圍請(qǐng)看 Java EE CDI bean scopes

          為什么CDI使用代理? 因?yàn)槿绻鸼ean的直接引用被注入,將會(huì)給被管理的bean造成諸如線(xiàn)程安全或并發(fā)訪(fǎng)問(wèn)的問(wèn)題。

          設(shè)想一下一個(gè)Session 范圍的 bean被注入到一個(gè)Application范圍的bean中去的情形。由于application 范圍的bean在所有客戶(hù)端間共享,如果多個(gè)客戶(hù)端同時(shí)訪(fǎng)問(wèn)一個(gè)application 范圍的bean,那么將會(huì)存在很高的風(fēng)險(xiǎn)出現(xiàn)這種情況:一個(gè)客戶(hù)端訪(fǎng)問(wèn)了其他客戶(hù)端正在訪(fǎng)問(wèn)的`session范圍的bean。

          為了處理這種問(wèn)題,CDI創(chuàng)造了代理并把代理注入進(jìn)注入點(diǎn)。由代理負(fù)責(zé)處理對(duì)被注入bean的調(diào)用,并實(shí)際去調(diào)用正確的bean實(shí)例。

          CDI創(chuàng)建的代理繼承自被注入bean的類(lèi)型。設(shè)想一下下面的情形:

          Application 和 Session 范圍的 bean

          @SessionScoped

          public class Service {

          public void doWork() {

          System.out.println("Working...");

          }

          }

          @ApplicationScoped

          public class SomeBean {

          @Inject

          private Service service;

          public void test(){

          service.doWork();

          }

          }

          CDI將把一個(gè)session范圍的bean的代理注入進(jìn)一個(gè)application范圍的bean中去。每一次對(duì)session范圍bean的調(diào)用,都 將通過(guò)代理進(jìn)行,代理會(huì)把調(diào)用重定向到正確的session范圍bean的實(shí)例,那個(gè)從屬于正確的HTTP request session的bean。

          CDI創(chuàng)建代理是通過(guò)繼承原來(lái)bean的類(lèi),并重寫(xiě)所有非私有方法。一個(gè)簡(jiǎn)單的典型的代理的例子可以像下面這樣:

          CDI 代理 示例

          ublic class Service$Proxy$_$$_WeldClientProxy

          extends Service {

          @Override

          public void doWork() {

          Service instance = // ... resolve bean instance

          instance.doWork();

          }

          }

          由于CDI代理通過(guò)繼承bean的類(lèi)來(lái)創(chuàng)建,所以當(dāng)我們討論非依賴(lài)性bean范圍的時(shí)候,你應(yīng)當(dāng)明白CDI有如下一些限制:

          CDI 不能注入原始類(lèi)型

          bean的類(lèi)必須有一個(gè)非私有的默認(rèn)構(gòu)造器

          bean的類(lèi)不能是final類(lèi)型的并且不能有任何final方法

        【Java EE CDI方式的依賴(lài)注入方法】相關(guān)文章:

        影響Java EE性能的因素11-24

        Java EE開(kāi)發(fā)常用框架10-13

        Java EE新手入門(mén)11-24

        j2ee與java的區(qū)別11-05

        Java EE性能的測(cè)試與調(diào)優(yōu)10-10

        JAVA EE架構(gòu)師需要具備的知識(shí)05-29

        j2ee與java web的區(qū)別11-05

        Java EE的Web服務(wù)體系結(jié)構(gòu)10-13

        Java多線(xiàn)程的實(shí)現(xiàn)方式10-07

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>