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

spring四種依賴注入方式的詳細介紹

 更新時間:2017年02月07日 09:43:54   作者:白糖_  
本篇文章主要介紹了spring四種依賴注入方式的詳細介紹,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

平常的java開發(fā)中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類實例的方法,這種開發(fā)存在的問題是new的類實例不好統(tǒng)一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉”,通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員,而控制反轉是指new實例工作不由我們程序員來做而是交給spring容器來做。

spring有多種依賴注入的形式,下面僅介紹spring通過xml進行IOC配置的方式:

1、Set注入

這是最簡單的注入方式,假設有一個SpringAction,類中需要實例化一個SpringDao對象,那么就可以定義一個private的SpringDao成員變量,然后創(chuàng)建SpringDao的set方法(這是ioc的注入入口):

package com.bless.springdemo.action; 
public class SpringAction { 
    //注入對象springDao 
  private SpringDao springDao; 
    //一定要寫被注入對象的set方法 
    public void setSpringDao(SpringDao springDao) { 
    this.springDao = springDao; 
  } 
 
    public void ok(){ 
    springDao.ok(); 
  } 
} 

 隨后編寫spring的xml文件,<bean>中的name屬性是class屬性的一個別名,class屬性指類的全名,因為在SpringAction中有一個公共屬性Springdao,所以要在<bean>標簽中創(chuàng)建一個<property>標簽指定SpringDao。<property>標簽中的name就是SpringAction類中的SpringDao屬性名,ref指下面<bean name="springDao"...>,這樣其實是spring將SpringDaoImpl對象實例化并且調用SpringAction的setSpringDao方法將SpringDao注入:

<!--配置bean,配置后該類由spring管理--> 
  <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
    <!--(1)依賴注入,配置當前類中相應的屬性--> 
    <property name="springDao" ref="springDao"></property> 
  </bean> 
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl">
</bean> 

2、構造器注入

這種方式的注入是指帶有參數的構造函數注入,看下面的例子,我創(chuàng)建了兩個成員變量SpringDao和User,但是并未設置對象的set方法,所以就不能支持第一種注入方式,這里的注入方式是在SpringAction的構造函數中注入,也就是說在創(chuàng)建SpringAction對象時要將SpringDao和User兩個參數值傳進來:

public class SpringAction { 
  //注入對象springDao 
  private SpringDao springDao; 
  private User user; 
   
  public SpringAction(SpringDao springDao,User user){ 
    this.springDao = springDao; 
    this.user = user; 
    System.out.println("構造方法調用springDao和user"); 
  } 
     
    public void save(){ 
    user.setName("卡卡"); 
    springDao.save(user); 
  } 
} 

在XML文件中同樣不用<property>的形式,而是使用<constructor-arg>標簽,ref屬性同樣指向其它<bean>標簽的name屬性:

<!--配置bean,配置后該類由spring管理--> 
  <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
    <!--(2)創(chuàng)建構造器注入,如果主類有帶參的構造方法則需添加此配置--> 
    <constructor-arg ref="springDao"></constructor-arg> 
    <constructor-arg ref="user"></constructor-arg> 
  </bean> 
    <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> 
     <bean name="user" class="com.bless.springdemo.vo.User"></bean>

 解決構造方法參數的不確定性,你可能會遇到構造方法傳入的兩參數都是同類型的,為了分清哪個該賦對應值,則需要進行一些小處理:

下面是設置index,就是參數位置:

<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
    <constructor-arg index="0" ref="springDao"></constructor-arg> 
    <constructor-arg index="1" ref="user"></constructor-arg> 
  </bean> 

另一種是設置參數類型:

<constructor-arg type="java.lang.String" ref=""/> 

3、靜態(tài)工廠的方法注入

靜態(tài)工廠顧名思義,就是通過調用靜態(tài)工廠的方法來獲取自己需要的對象,為了讓spring管理所有對象,我們不能直接通過"工程類.靜態(tài)方法()"來獲取對象,而是依然通過spring注入的形式獲?。?/p>

package com.bless.springdemo.factory; 
 
import com.bless.springdemo.dao.FactoryDao; 
import com.bless.springdemo.dao.impl.FactoryDaoImpl; 
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl; 
 
public class DaoFactory { 
  //靜態(tài)工廠 
  public static final FactoryDao getStaticFactoryDaoImpl(){ 
    return new StaticFacotryDaoImpl(); 
  } 
} 

同樣看關鍵類,這里我需要注入一個FactoryDao對象,這里看起來跟第一種注入一模一樣,但是看隨后的xml會發(fā)現有很大差別:

 public class SpringAction { 
    //注入對象 
  private FactoryDao staticFactoryDao; 
   
  public void staticFactoryOk(){ 
    staticFactoryDao.saveFactory(); 
  } 
  //注入對象的set方法 
  public void setStaticFactoryDao(FactoryDao staticFactoryDao) { 
    this.staticFactoryDao = staticFactoryDao; 
  } 
} 

Spring的IOC配置文件,注意看<bean name="staticFactoryDao">指向的class并不是FactoryDao的實現類,而是指向靜態(tài)工廠DaoFactory,并且配置 factory-method="getStaticFactoryDaoImpl"指定調用哪個工廠方法:

<!--配置bean,配置后該類由spring管理--> 
  <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > 
    <!--(3)使用靜態(tài)工廠的方法注入對象,對應下面的配置文件(3)--> 
    <property name="staticFactoryDao" ref="staticFactoryDao"></property> 
        </property> 
  </bean> 
  <!--(3)此處獲取對象的方式是從工廠類中獲取靜態(tài)方法--> 
  <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean> 

4、實例工廠的方法注入

實例工廠的意思是獲取對象實例的方法不是靜態(tài)的,所以你需要首先new工廠類,再調用普通的實例方法:

public class DaoFactory { 
  //實例工廠 
  public FactoryDao getFactoryDaoImpl(){ 
    return new FactoryDaoImpl(); 
  } 
} 

那么下面這個類沒什么說的,跟前面也很相似,但是我們需要通過實例工廠類創(chuàng)建FactoryDao對象:

public class SpringAction { 
  //注入對象 
  private FactoryDao factoryDao; 
   
  public void factoryOk(){ 
    factoryDao.saveFactory(); 
  } 
 
  public void setFactoryDao(FactoryDao factoryDao) { 
    this.factoryDao = factoryDao; 
  } 
} 

最后看spring配置文件:

<!--配置bean,配置后該類由spring管理--> 
  <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
    <!--(4)使用實例工廠的方法注入對象,對應下面的配置文件(4)--> 
    <property name="factoryDao" ref="factoryDao"></property> 
  </bean> 
   
  <!--(4)此處獲取對象的方式是從工廠類中獲取實例方法--> 
  <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> 
  <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean> 

總結

Spring IOC注入方式用得最多的是(1)(2)種,多謝多練就會非常熟練。

另外注意:通過Spring創(chuàng)建的對象默認是單例的,如果需要創(chuàng)建多實例對象可以在<bean>標簽后面添加一個屬性:

<bean name="..." class="..." scope="prototype"> 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 如何使用mybatis-generator自動生成代碼

    如何使用mybatis-generator自動生成代碼

    這篇文章主要介紹了如何使用mybatis-generator自動生成代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java性能調優(yōu)System的gc垃圾回收方法

    java性能調優(yōu)System的gc垃圾回收方法

    這篇文章主要為大家介紹了java性能調優(yōu)System的gc垃圾回收方法示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • springboot攔截器Interceptor的使用,你都了解嗎

    springboot攔截器Interceptor的使用,你都了解嗎

    springmvc 中的攔截器可以對請求進行判別,在請求到達控制器之前,把非法的請求給攔截掉下面來說一說, 它在springboot中的使用,感興趣的朋友一起看看吧
    2021-07-07
  • java的JsonObject對象提取值方法

    java的JsonObject對象提取值方法

    下面小編就為大家分享一篇java的JsonObject對象提取值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • JDK的具體安裝步驟(帶圖帶解釋巨詳細)

    JDK的具體安裝步驟(帶圖帶解釋巨詳細)

    Java是一種廣泛使用的編程語言,許多應用程序和系統(tǒng)都依賴于它,如果您想進行Java編程或運行Java應用程序,首先需要安裝Java開發(fā)工具包(JDK),這篇文章主要給大家介紹了關于JDK具體安裝步驟的相關資料,文中介紹的方法帶圖帶解釋巨詳細,需要的朋友可以參考下
    2024-05-05
  • java 設計模式之依賴倒置實例詳解

    java 設計模式之依賴倒置實例詳解

    這篇文章主要介紹了java 設計模式之依賴倒置,結合實例形式詳細分析了依賴倒置的相關概念、原理、使用技巧及相關操作注意事項,需要的朋友可以參考下
    2019-11-11
  • Idea?springboot?springCloud熱加載熱調試兩種常用方式

    Idea?springboot?springCloud熱加載熱調試兩種常用方式

    這篇文章主要介紹了Idea?springboot?springCloud熱加載熱調試常用的兩種方式,在項目開發(fā)的過程中,需要修改調試的時候偶每次都需要重啟項目浪費時間,下面是我整理的兩種常用的兩種方式,需要的朋友可以參考下
    2023-04-04
  • Java 生成隨機驗證碼圖片的示例

    Java 生成隨機驗證碼圖片的示例

    這篇文章主要介紹了Java 生成隨機驗證碼圖片的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • java中sleep方法和wait方法的五個區(qū)別

    java中sleep方法和wait方法的五個區(qū)別

    這篇文章主要介紹了java中sleep方法和wait方法的五個區(qū)別,sleep?方法和?wait?方法都是用來將線程進入休眠狀態(tài),但是又有一些區(qū)別,下面我們就一起來看看吧
    2022-05-05
  • Java實現反轉一個鏈表的示例代碼

    Java實現反轉一個鏈表的示例代碼

    本文主要介紹了Java實現反轉一個鏈表的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論