1. 程式人生 > >Spring的依賴注入( 設值注入)

Spring的依賴注入( 設值注入)

 設值注入

  設值注入是指通過setter方法傳入被呼叫者的例項。這種注入方式簡單、直觀,因而在Spring的依賴注入裡大量使用。看下面程式碼,是Person的介面

//定義Person介面
public interface Person
{
 //Person接口裡定義一個使用斧子的方法
 public void useAxe();
}


  然後是Axe的介面

//定義Axe介面

public interface Axe
{
 //Axe接口裡有個砍的方法
 public void chop();
}

  Person的實現類

//Chinese實現Person介面

public class Chinese implements Person
{
 //面向Axe介面程式設計,而不是具體的實現類
 private Axe axe;
 //預設的構造器
 public Chinese()
 {}
 //設值注入所需的setter方法
 public void setAxe(Axe axe)
 {
  this.axe = axe;
 }
 //實現Person介面的useAxe方法
 public void useAxe()
 {
  System.out.println(axe.chop());
 }
}

  Axe的第一個實現類

//Axe的第一個實現類 StoneAxe

public class StoneAxe implements Axe
{
 //預設構造器
 public StoneAxe()
 {}
 //實現Axe介面的chop方法
 public String chop()
 {
  return "石斧砍柴好慢";
 }
}

  下面採用Spring的配置檔案將Person例項和Axe例項組織在一起。配置檔案如下所示:

<!-- 下面是標準的XML檔案頭 -->
<?xml version="1.0" encoding="gb2312"?>
<!-- 下面一行定義Spring的XML配置檔案的dtd -->
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- 以上三行對所有的Spring配置檔案都是相同的 -->
<!-- Spring配置檔案的根元素 -->
<BEANS>
 <!—定義第一bean,該bean的id是chinese, class指定該bean例項的實現類 -->
 <BEAN class=lee.Chinese id=chinese>
 <!-- property元素用來指定需要容器注入的屬性,axe屬性需要容器注入此處是設值注入,因此Chinese類必須擁有setAxe方法 -->
<property name="axe">
<!-- 此處將另一個bean的引用注入給chinese bean -->
<REF local="”stoneAxe”/">
</property>
</BEAN>
<!-- 定義stoneAxe bean -->
<BEAN class=lee.StoneAxe id=stoneAxe />
</BEANS>

  從配置檔案中,可以看到Spring管理bean的靈巧性。bean與bean之間的依賴關係放在配置檔案裡組織,而不是寫在程式碼裡。通過配置檔案的指定,Spring能精確地為每個bean注入屬性。因此,配置檔案裡的bean的class元素,不能僅僅是介面,而必須是真正的實現類。

  Spring會自動接管每個bean定義裡的property元素定義。Spring會在執行無引數的構造器後、建立預設的bean例項後,呼叫對應的setter方法為程式注入屬性值。property定義的屬性值將不再由該bean來主動建立、管理,而改為被動接收Spring的注入。

  每個bean的id屬性是該bean的惟一標識,程式通過id屬性訪問bean,bean與bean的依賴關係也通過id屬性完成。

  下面看主程式部分:

public class BeanTest
{
 //主方法,程式的入口
 public static void main(String[] args)throws Exception
 {
  //因為是獨立的應用程式,顯式地例項化Spring的上下文。
  ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
  //通過Person bean的id來獲取bean例項,面向介面程式設計,因此
  //此處強制型別轉換為介面型別
  Person p = (Person)ctx.getBean("chinese");
  //直接執行Person的userAxe()方法。
  p.useAxe();
 }
}

  程式的執行結果如下:

  石斧砍柴好慢

  主程式呼叫Person的useAxe()方法時,該方法的方法體內需要使用Axe的例項,但程式裡沒有任何地方將特定的Person例項和Axe例項耦合在一起。或者說,程式裡沒有為Person例項傳入Axe的例項,Axe例項由Spring在執行期間動態注入。

  Person例項不僅不需要了解Axe例項的具體實現,甚至無須瞭解Axe的建立過程。程式在執行到需要Axe例項的時候,Spring建立了Axe例項,然後注入給需要Axe例項的呼叫者。Person例項執行到需要Axe例項的地方,自然就產生了Axe例項,用來供Person例項使用。

  呼叫者不僅無須關心被呼叫者的實現過程,連工廠定位都可以省略(真是按需分配啊!)。下面也給出使用Ant編譯和執行該應用的簡單指令碼:

<?xml version="1.0"?>
<!-- 定義編譯該專案的基本資訊-->
<PROJECT name="spring" default="." basedir=".">
<!-- 定義編譯和執行該專案時所需的庫檔案 -->
<PATH id=classpath>
 <!-- 該路徑下存放spring.jar和其他第三方類庫 -->
 <FILESET dir=../../lib>
  <INCLUDE name="*.jar" />
 </FILESET>
 <!-- 同時還需要引用已經編譯過的class檔案-->
 <PATHELEMENT path="." />
</PATH>
<!-- 編譯全部的java檔案-->
<TARGET description="Compile all source code" name="compile">
<!-- 指定編譯後的class檔案的存放位置 -->
<JAVAC debug="true" destdir=".">
 deprecation="false" optimize="false" failonerror="true">
 <!-- 指定需要編譯的原始檔的存放位置 -->
 <SRC path="." />
 <!-- 指定編譯這些java檔案需要的類庫位置-->
 <CLASSPATH refid="classpath" />
</JAVAC>
</TARGET>
<!-- 執行特定的主程式 -->
<TARGET description="run the main class" name="run" depends="compile">
<!-- 指定執行的主程式:lee.BeanTest。-->
<JAVA failonerror="true" fork="yes" classname="lee.BeanTest">
 <!-- 指定執行這些java檔案需要的類庫位置-->
 <CLASSPATH refid="classpath" />
</JAVA>
</TARGET>
</PROJECT>

  如果需要改寫Axe的實現類。或者說,提供另一個實現類給Person例項使用。Person介面、Chinese類都無須改變。只需提供另一個Axe的實現,然後對配置檔案進行簡單的修改即可。

  Axe的另一個實現如下:

//Axe的另一個實現類 SteelAxe
public class SteelAxe implements Axe
{
 //預設構造器
 public SteelAxe()
 {}
 //實現Axe介面的chop方法
 public String chop()
 {
  return "鋼斧砍柴真快";
 }
}

  然後,修改原來的Spring配置檔案,在其中增加如下一行:

<!-- 定義一個steelAxe bean-->
<BEAN class=lee.SteelAxe id=steelAxe />

  該行重新定義了一個Axe的實現:SteelAxe。然後修改chinese bean的配置,將原來傳入stoneAxe的地方改為傳入steelAxe。也就是將

<REF local="”stoneAxe”/">

  改成

<REF local="”steelAxe”/">

  此時再次執行程式,將得到如下結果:

  鋼斧砍柴真快

  Person與Axe之間沒有任何程式碼耦合關係,bean與bean之間的依賴關係由Spring管理。採用setter方法為目標bean注入屬性的方式,稱為設值注入。

  業務物件的更換變得相當簡單,物件與物件之間的依賴關係從程式碼裡分離出來,通過配置檔案動態管理。

相關推薦

Spring依賴注入( 注入)

 設值注入  設值注入是指通過setter方法傳入被呼叫者的例項。這種注入方式簡單、直觀,因而在Spring的依賴注入裡大量使用。看下面程式碼,是Person的介面//定義Person介面public interface Person{ //Person接口裡定義一個使用斧子

spring 框架中的依賴注入(IOC--注入)---使用xml簡單配置檔案---的具體例項的簡單實現

體現了具體專案工程裡面的分層,dao,daoImpl,service,serviceImpl,action。讓你真正的理解這為啥分層。 畢竟當年我剛剛畢業的時候,再找工作我就不是很清楚為什麼有這麼幾層

spring 框架中的依賴注入(IOC--注入)--使用註解--的具體例項的簡單實現

體現了具體專案工程裡面的分層,dao,daoImpl,service,serviceImpl,action。讓你真正的理解這為啥分層。 順便清清楚楚的理解@Component、@Service、@Re

Spring的核心機制:依賴注入注入和構造注入的區別

Ø 理解依賴注入 在分析原理之前我們先回顧下依賴注入的概念:我們常提起的依賴注入(Dependency Injection)和控制反轉(Inversion of Control)是同一個概念。具體含義是:當某個角色(可能是一個Java例項,呼叫者)需要另一個角色(另一個Jav

Spring:注入用法

首先明確Java中什麼是依賴關係:   類A依賴類B的意思是,如果A的物件要完成某一操作,必須使用B的物件的某些操作來幫忙,才能完成。簡言之,B作為A的某個方法的方法引數存在。如下: class A{ public void f(B b){ } } c

Spring注入和構造注入

設值注入 概念: 指 IoC容器通過成員變數的setter方法來注入被依賴物件 介面 public interface User{ public addCard(); } public interface Card{ public

Spring IOC 構造方法注入注入的比較

構造子注入的配置檔案: <bean id="orderService"         class="com.lizjason.spring.OrderService">         <constructor-arg index="0" ref="or

Spring注入案例分析(注入和構造注入)

日期: 2016-7-14 內容: 學習和記錄Spring的注入內容: 一、什麼是Spring的注入: spring的注入是指在啟動spring容器載入Bean配置的時候,完成對對變數的賦值行為。

Spring注入和構造注入的比較

在過去的開發過程中,這兩種注入方式都是非常常用的。Spring也同時支援這兩種依賴注入的方式:設值注入和構造注入。這兩種依賴注入的方式並沒有絕對的好壞,知識適應的場景不一樣。 相比而言設定注入具有以下優點:                    1)與傳統的JavaBean

Spring基礎(4)——注入、構造注入

設值注入:也稱屬性注入,是指通過setter()方法傳入被呼叫者的例項。這種注入方式簡單、直觀,在Spring依賴注入中也是最常用的。public interface Animal {     public void eatFood(); }public interface

property和constructor-arg注入

一、注入的方式  配置檔案的根元素是beans,每個元件使用bean元素來定義,如果使用設值注入,可以利用以下方式,來指定元件的屬性。   constructor-arg:通過建構函式注入。    p

Spring基於建構函式和函式的依賴注入

基於建構函式的依賴注入 我們知道,bean標籤中指定的類會進行初始化,這個初始化過程中自然會呼叫建構函式,那我們也可以利用這個建構函式完成依賴注入。 先建立一個類: public class TextEditor { public TextEditor(SpellChecker spellCheck

spring 依賴注入的理解

先看一段程式碼假設你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。 人有時候需要用手機打電話,需要用到手機的dialUp方法。 傳統的寫法是這樣: Java code public class Person{ public boolean makeCall(long nu

Spring依賴注入static靜態變數相關問題

Spring依賴注入static靜態變數相關問題   版權宣告:本文為博主原創文章,轉載請註明出處,謝謝。 https://blog.csdn.net/rongxiang111/article/details/78881371 1.Spring不支援依賴注入static靜態變數

Spring依賴注入(構造引數注入、集合,陣列屬性注入、XML自動注入 ,全註解配置)

依賴注入 構造引數注入        --> 常用的是方案一和方案二         MyBean類  YouBean類 <?xml version="1.0" encodin

spring學習總結——高階裝配學習四(執行時:注入

  前言:   當討論依賴注入的時候,我們通常所討論的是將一個bean引用注入到另一個bean的屬性或構造器引數中。bean裝配的另外一個方面指的是將一個值注入到bean的屬性或者構造器引數中。在沒有學習使用怎麼注入外部值時,我們正常是直接將值寫死在程式碼中。如將專輯的名字裝配到BlankDis

spring boot去除掃描自動注入依賴方法——Spring常用註解使用方法

問題: 最近做專案的時候,需要引入其他的jar。然後還需要掃描這些jar裡的某些bean。於 是使用註解:@ComponentScan 這個註解直接指定包名就可以,它會去掃描這個包下所有的class,然後判斷是否解析: 原始碼: public @interface SpringBoo

Spring 依賴注入(DI)示例

依賴注入 依賴注入是為了解決緊耦合問題而產生的一種技術,緊耦合的程式碼難以測試、難以複用、難以理解,當程式出現bug時,修復bug經常會產生連鎖反應,但是,一定程度的耦合又是必須的,完全沒有耦合的程式碼什麼也做不了。所以一種比較好的方案就是,將依賴關係交給第三方元件來描述。 通過DI,物

淺談Spring依賴注入靜態成員變數

Spring的依賴注入是基於bean物件注入屬性;如果在一個類中定義了一個static修飾的成員變數,那麼這個變數就是屬於類的,無法完成依賴注入 eg: 假設在xml配置檔案已經配置了SolrTemplate物件 @Autowired private stat

spring依賴注入(Depondency Injection)

(1)lookup-method <bean id="engine" class="pojo.Engine"></bean> <bean id="car" abstrac