欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析Java的Spring框架中bean的依賴注入

 更新時間:2015年12月05日 17:38:06   投稿:goldensun  
這篇文章主要介紹了Java的Spring框架中bean的依賴注入,講解了以構造函數(shù)為基礎的依賴注入和基于setter方法的依賴注入的方式,需要的朋友可以參考下

每一個基于java的應用程序都有一個共同工作來展示給用戶看到的內容作為工作的應用幾個對象。當編寫一個復雜的Java應用程序,應用程序類應該盡可能獨立其他Java類來增加重復使用這些類,并獨立于其他類別的測試它們,而這樣做單元測試的可能性。依賴注入(或有時稱為布線)有助于粘合這些類在一起,同時保持他們的獨立。

考慮有其中有一個文本編輯器組件的應用程序,要提供拼寫檢查。標準的代碼將看起來像這樣:

 

public class TextEditor {
  private SpellChecker spellChecker;
  public TextEditor() {
   spellChecker = new SpellChecker();
  }
}

我們在這里所做的就是創(chuàng)建文本編輯和拼寫檢查之間的依賴性。在控制方案中的反轉,我們反而會做這樣的事情:

public class TextEditor {
  private SpellChecker spellChecker;
  public TextEditor(SpellChecker spellChecker) {
   this.spellChecker = spellChecker;
  }
}

在這里,文本編輯不應該擔心拼寫檢查落實。拼寫檢查器將獨立實施,將提供給文本編輯在文本編輯實例化的時候,這整個過程是由Spring框架的控制。

在這里,我們已經(jīng)刪除從文本編輯的全面控制,并保持它在其他地方(即XML配置文件)和依賴性(即類拼寫檢查)被注入到類文本編輯通過類構造函數(shù)。因此,流程控制已經(jīng)“倒”通過依賴注入(DI),因為已經(jīng)有效地委派依賴一些外部系統(tǒng)。

依賴注入的第二種方法是通過文本編輯類,我們將創(chuàng)建拼寫檢查實例的setter方法​​,該實例將被用來調用setter方法​​來初始化文本編輯的屬性。

因此,DI主要有兩種變體和下面的兩個子章將涵蓋兩者結合實例:

基于構造函數(shù)的依賴注入
當容器調用類的構造函數(shù)有多個參數(shù),每個代表在其他類中的構造函數(shù)依賴關系為基礎的DI來完成。

例子:
下面的例子顯示了一個類文本編輯TextEditor 只能是依賴注入與構造函數(shù)注入。

我們使用Eclipse IDE,然后按照下面的步驟來創(chuàng)建一個Spring應用程序:

2015125173523613.png (588×320)

這里是TextEditor.java文件的內容:

package com.yiibai;

public class TextEditor {
  private SpellChecker spellChecker;

  public TextEditor(SpellChecker spellChecker) {
   System.out.println("Inside TextEditor constructor." );
   this.spellChecker = spellChecker;
  }
  public void spellCheck() {
   spellChecker.checkSpelling();
  }
}

下面是另外一個相關的類文件SpellChecker.java內容:

package com.yiibai;

public class SpellChecker {
  public SpellChecker(){
   System.out.println("Inside SpellChecker constructor." );
  }

  public void checkSpelling() {
   System.out.println("Inside checkSpelling." );
  }
  
}

以下是MainApp.java文件的內容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
  public static void main(String[] args) {
   ApplicationContext context = 
       new ClassPathXmlApplicationContext("Beans.xml");

   TextEditor te = (TextEditor) context.getBean("textEditor");

   te.spellCheck();
  }
}

以下是配置文件beans.xml文件里面有配置為基于構造函數(shù)的注入:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <!-- Definition for textEditor bean -->
  <bean id="textEditor" class="com.yiibai.TextEditor">
   <constructor-arg ref="spellChecker"/>
  </bean>

  <!-- Definition for spellChecker bean -->
  <bean id="spellChecker" class="com.yiibai.SpellChecker">
  </bean>

</beans>

創(chuàng)建源代碼和bean配置文件完成后,讓我們運行應用程序。如果一切順利將打印以下信息:

Inside SpellChecker constructor.
Inside TextEditor constructor.
Inside checkSpelling.

構造函數(shù)的參數(shù)解析:
可能有歧義存在,而將參數(shù)傳遞給構造函數(shù)的情況下有一個以上的參數(shù)。要解決這種不確定性,其中的構造器參數(shù)在一個bean定義中定義的順序就是這些參數(shù)提供給適當?shù)臉嬙旌瘮?shù)的順序。請考慮下面的類:

package x.y;

public class Foo {
  public Foo(Bar bar, Baz baz) {
   // ...
  }
}

下面的配置工作正常:

<beans>
  <bean id="foo" class="x.y.Foo">
   <constructor-arg ref="bar"/>
   <constructor-arg ref="baz"/>
  </bean>

  <bean id="bar" class="x.y.Bar"/>
  <bean id="baz" class="x.y.Baz"/>
</beans>

讓我們檢查一個更多情況下我們通過不同類型的構造函數(shù)。請考慮下面的類:

package x.y;

public class Foo {
  public Foo(int year, String name) {
   // ...
  }
}

容器也可以使用類型匹配與簡單類型,如果你明確地指定使用type屬性的構造函數(shù)的參數(shù)類型。例如:

<beans>

  <bean id="exampleBean" class="examples.ExampleBean">
   <constructor-arg type="int" value="2001"/>
   <constructor-arg type="java.lang.String" value="Zara"/>
  </bean>

</beans>

最后,并通過構造函數(shù)參數(shù)的最佳方法,使用索引屬性來顯式地指定一個構造器參數(shù)的索引。這里的索引是從0開始。例如:

<beans>

  <bean id="exampleBean" class="examples.ExampleBean">
   <constructor-arg index="0" value="2001"/>
   <constructor-arg index="1" value="Zara"/>
  </bean>

</beans>

最后需要說明的,如果你傳遞一個引用到一個對象,需要使用<constructor-arg>標簽的ref屬性,如果是直接傳遞一個值,那么應該使用value屬性。

基于setter方法的依賴注入
基于setter DI由容器調用setter方法​​對bean調用無參構造器或無參static工廠方法實例化bean之后完成。
這里是TextEditor.java文件的內容:

package com.yiibai;

public class TextEditor {
  private SpellChecker spellChecker;

  // a setter method to inject the dependency.
  public void setSpellChecker(SpellChecker spellChecker) {
   System.out.println("Inside setSpellChecker." );
   this.spellChecker = spellChecker;
  }
  // a getter method to return spellChecker
  public SpellChecker getSpellChecker() {
   return spellChecker;
  }

  public void spellCheck() {
   spellChecker.checkSpelling();
  }
}

在這里,需要檢查setter方法​​的命名約定。設置我們使用setSpellChecker()方法,這是非常類似于Java POJO類的變量的拼寫檢查器。讓我們創(chuàng)造另一個相關的類文件SpellChecker.java,內容如下:

package com.yiibai;

public class SpellChecker {
  public SpellChecker(){
   System.out.println("Inside SpellChecker constructor." );
  }

  public void checkSpelling() {
   System.out.println("Inside checkSpelling." );
  }
  
}

以下是MainApp.java文件的內容:

package com.yiibai;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
  public static void main(String[] args) {
   ApplicationContext context = 
       new ClassPathXmlApplicationContext("Beans.xml");

   TextEditor te = (TextEditor) context.getBean("textEditor");

   te.spellCheck();
  }
}

以下是配置文件beans.xml文件里面有配置為基于setter方法​​注入:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <!-- Definition for textEditor bean -->
  <bean id="textEditor" class="com.yiibai.TextEditor">
   <property name="spellChecker" ref="spellChecker"/>
  </bean>

  <!-- Definition for spellChecker bean -->
  <bean id="spellChecker" class="com.yiibai.SpellChecker">
  </bean>

</beans>

應該注意在基于構造函數(shù)注入和setter注入定義beans.xml文件的差異。唯一的區(qū)別是,我們已經(jīng)使用<constructor-arg>標簽為基于構造函數(shù)的注入和的<property>標簽為基于setter注入的<bean>元素內。

需要注意的第二個重要的一點是,如果傳遞一個引用到一個對象,需要使用<property>標簽的ref屬性,如果是直接傳遞一個值,那么應該使用value屬性。

創(chuàng)建源代碼和bean配置文件完成后,讓我們運行應用程序。如果一切順利,這將打印以下信息:

Inside SpellChecker constructor.
Inside setSpellChecker.
Inside checkSpelling.

采用p名稱空間的XML配置:
如果你有很多的setter方法​​則可以很方便地使用p名稱空間的XML配置文件中。讓我們查看他們的區(qū)別:

讓我們來用的<property>標簽標準的XML配置文件的例子:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <bean id="john-classic" class="com.example.Person">
   <property name="name" value="John Doe"/>
   <property name="spouse" ref="jane"/>
  </bean>

  <bean name="jane" class="com.example.Person">
   <property name="name" value="John Doe"/>
  </bean>

</beans>

上面的XML配置可重寫使用 p-namespace如下一個簡潔的方法:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <bean id="john-classic" class="com.example.Person"
   p:name="John Doe"
   p:spouse-ref="jane"/>
  </bean>

  <bean name="jane" class="com.example.Person"
   p:name="John Doe"/>
  </bean>

</beans>

在這里,不應該在指定原始值和對空間對象引用的區(qū)別。-ref部分表示,這不是直鏈的值,而是一個引用到另一個bean中。

相關文章

  • 一篇文章帶你了解Java SpringBoot Nacos

    一篇文章帶你了解Java SpringBoot Nacos

    這篇文章主要介紹了SpringBoot使用Nacos配置中心的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-09-09
  • java使用lambda表達式對List集合進行操作技巧(JDK1.8)

    java使用lambda表達式對List集合進行操作技巧(JDK1.8)

    這篇文章主要介紹了java使用lambda表達式對List集合進行操作技巧適用jdk1.8,感興趣的朋友跟著小編一起看看實現(xiàn)代碼吧
    2018-06-06
  • Java文件寫入器FileWriter使用指南

    Java文件寫入器FileWriter使用指南

    在Java中,FileWriter類用于將字符寫入文件中,它繼承了Writer類,因此可以使用Writer類中的所有方法,下面我們就來深入探討一下FileWriter類的使用方法吧
    2023-10-10
  • 淺談springboot自動裝配原理

    淺談springboot自動裝配原理

    作為Spring Boot的精髓,自動配置原理首當其沖.今天就帶大家了解一下springboot自動裝配的原理,文中有非常詳細的代碼示例,對正在學習java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • java發(fā)送郵件示例講解

    java發(fā)送郵件示例講解

    這篇文章主要為大家詳細介紹了java發(fā)送郵件示例的全過程,溫習郵件協(xié)議,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 基于Lucene的Java搜索服務器Elasticsearch安裝使用教程

    基于Lucene的Java搜索服務器Elasticsearch安裝使用教程

    Elasticsearch也是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,能夠做到實時搜索,且穩(wěn)定、可靠、快速,安裝使用方便,這里我們就來看一下基于Lucene的Java搜索服務器Elasticsearch安裝使用教程:
    2016-06-06
  • Spring事務管理中的異常回滾是什么

    Spring事務管理中的異常回滾是什么

    Spring中的代碼出現(xiàn)異常時會回滾這是大家都希望的情況,這時候可以用@Transactional這個注解放在你的方法上來進行回滾,這時候有個問題就是事務回滾是不希望你在Controller進行處理,而是在Service層來進行處理
    2023-02-02
  • 關于java中線程安全問題詳解

    關于java中線程安全問題詳解

    最近工作中遇到不少多線程問題,但自己一直對多線程的理解比較表層,所以深入研究了一番,下面這篇文章主要給大家介紹了關于java中線程安全問題的相關資料,需要的朋友可以參考下
    2021-11-11
  • java 動態(tài)加載的實現(xiàn)代碼

    java 動態(tài)加載的實現(xiàn)代碼

    這篇文章主要介紹了java 動態(tài)加載的實現(xiàn)代碼的相關資料,Java動態(tài)加載類主要是為了不改變主程序代碼,通過修改配置文件就可以操作不同的對象執(zhí)行不同的功能,需要的朋友可以參考下
    2017-07-07
  • java實現(xiàn)時間控制的幾種方案

    java實現(xiàn)時間控制的幾種方案

    這篇文章主要介紹了java實現(xiàn)時間控制的幾種方案,本文從多個方面給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07

最新評論