黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 詳解Spring注入bean的幾種方式

詳解Spring注入bean的幾種方式

更新時間:2021-09-10 10:41:24 來源:動力節(jié)點 瀏覽1573次

首先,要學習Spring中的Bean的注入方式,就要先了解什么是依賴注入。依賴注入是指:讓調用類對某一接口的實現(xiàn)類的實現(xiàn)類的依賴關系由第三方注入,以此來消除調用類對某一接口實現(xiàn)類的依賴。

Spring容器中支持的依賴注入方式主要有屬性注入、構造函數(shù)注入、工廠方法注入。接下來將為大家詳細介紹這三種依賴注入的方式以及它們的具體配置方法。

1.屬性注入

屬性注入即通過setXXX( )方法注入bean的屬性值或依賴對象。由于屬性注入方式具有可選擇性和靈活性高的特點,因此它也是實際開發(fā)中最常用的注入方式。

Spring首先會調用bean的默認構造函數(shù)實例化bean對象,然后再通過反射的方法調用set方法來注入屬性值。

屬性注入要求bean提供一個默認的構造函數(shù) ,并且得為需要注入的屬性提供 set方法 。

TIps:所謂默認的構造函數(shù),即不帶參數(shù)的構造函數(shù)。如果類中沒有自定義任何構造函數(shù),則系統(tǒng)(JVM)會自動生成一個不帶參的默認構造函數(shù),如果類中顯式的自定義了有參數(shù)的構造函數(shù),則系統(tǒng)就不會在自動生成默認構造函數(shù),需要自己手動再加一個無參的構造函數(shù)。

下面通過一個實例來演示Spring中bean的屬性注入方式:

編寫一個user類:

package com.Kevin.bean;
/**
 * 創(chuàng)建一個類測試bean的屬性注入方式
 * @author Kevin
 *
 */
public class User {  
  private String username;
  public String getUsername() {
    return username;
  } 
  public void setUsername(String username) {
    this.username = username;
  }
}

配置文件:

<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> 
  <!-- 配置對象 -->
  <bean id="user" class="com.Kevin.bean.User">
    <property name="username">
      <value>Kevin</value>
    </property>
  </bean>  
</beans>

其中,每個屬性值對應一個property標簽,name屬性值為類中屬性的名稱。在bean實現(xiàn)類中擁有與其對應的實現(xiàn)方法setUsername( )。

Tips:Spring只會檢查bean中是否含有setter方法,而對是否有對應的屬性變量則不作具體要求,但按照約定俗成的規(guī)則我們最好為其設定相應的屬性變量。

Spring中<property>標簽的命名規(guī)范:

Spring的<property>標簽所指定的屬性名稱和bean實現(xiàn)類的setter方法滿足Sun JavaBean的屬性命名規(guī)范,即XXX的屬性對應setXXX( )的方法。

一般情況下,java的屬性變量名都以小寫字母開頭,但考慮到一些特殊意義的英文縮略詞,java bean也允許一些大寫字母開頭的變量名。但必須滿足以下兩點:

變量的前兩個字母要么全部大寫,要么全部小寫;

但以一般編程習慣來說,屬性名最好全部使用小寫字母,方便編程和閱讀。

對于屬性注入方式來說,只能人為的在配置文件中提供保證,而無法在語法級別提供保證。此時就需要使用構造函數(shù)注入這種方式,以此來更好的滿足要求。

2.構造函數(shù)注入

構造函數(shù)注入是除屬性注入之外的另一種常用的注入方式,它可以保證一些必要的屬性在bean實例化時就得到了設置,并在實例化后就可以使用。

使用構造函數(shù)注入的前提是: bean必須提供帶參的構造函數(shù)。

對于構造函數(shù)的注入,配置文件可以有以下幾種方式:

按類型匹配入參

按索引匹配入參

聯(lián)合使用類型和索引匹配入參

通過自身類型反射匹配入參

3.工廠方法注入

工廠方法是應用中被經常使用的設計模式,也是控制反轉和單實例設計思想的主要實現(xiàn)方法。工廠類負責創(chuàng)建一個或多個工廠類實例,工廠類方法一般以接口或抽象類變量的形式返回目標類實例。

工廠類對外屏蔽了目標類的實例化步驟,調用者甚至根本不用指定具體的目標類是什么。由于Spring容器以框架的方法提供工廠方法的功能,并以透明的方式開放給開發(fā)者。因此很少需要手工編寫工程方法。但在一些遺留系統(tǒng)或第三方類庫中還是會碰到工程方法,此時便可以使用Spring工廠注入的方法來進行Spring的注入。

Spring工廠注入的方法可以分為靜態(tài)和非靜態(tài)兩種。

(1)非靜態(tài)工廠方法

有些工廠方法是非靜態(tài)的,必須實例化工廠類之后才能調用工廠方法。下面通過一個實例來演示。

編寫工廠類:

package com.Kevin.factorybean;
/**
 * 編寫工廠類測試非靜態(tài)工廠方法注入
 * @author Kevin
 *
 */ 
public class BookFactory {
  public Book buyBook(){
    Book book = new Book();
    book.setName("Think in Java");
    return book;
  }
}

配置文件編寫:

<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> 
  <!-- 配置對象 -->
  <bean id="bookFactory" class="com.Kevin.factorybean.BookFactory"></bean>
  <bean id="book" factory-bean="bookFactory" factory-method="buyBook"></bean>
  </beans>

由于bookFactory的工廠方法不是靜態(tài)的,因此需要先定義一個工廠類的bean,然后通過 factory-bean 屬性來引用工廠bean實例。再通過屬性 factory-method 來指定對應的工廠方法。

(2)靜態(tài)工廠方法

很多工廠類方法都是靜態(tài)的,這意味著無需創(chuàng)建工廠類實例的情況下就可以調用工廠類方法。因此靜態(tài)工程方法比非靜態(tài)工廠方法的調用更加方便簡潔。下面通過一個實例來演示靜態(tài)工廠方法。

編寫factory類:

package com.Kevin.factorybean;
/**
 * 編寫工廠類測試靜態(tài)工廠方法注入
 * @author Kevin
 *
 */
public class CarFactory {
  public static Car createCar(){
    Car car = new Car();
    car.setBrand("Lamborghini");
    return car;
  }
}

編寫配置文件:

<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
  <!-- 配置對象 -->
  <bean id="car" class="com.Kevin.factorybean.Car" factory-method="createCar"></bean>  
</beans>

總結

Spring提供了三種可供選擇的注入方式,但在實際應用中,我們究竟該選擇哪種注入方式,并沒有統(tǒng)一的標準,如下是一些可以參考的理由:

構造函數(shù)注入理由:

構造函數(shù)保證重要屬性預先設置;

無需提供每個屬性的setter方法,減少類的方法個數(shù);

可以更好地封裝類變量,避免外部錯誤調用。

屬性注入理由:

屬性過多時,構造函數(shù)變的臃腫;

構造函數(shù)注入靈活性不強,有時需要為屬性注入null值;

多個構造函數(shù)時,配置上產生歧義,復雜度升高;

構造函數(shù)不利于類的繼承和擴展;

構造函數(shù)注入會引起循環(huán)依賴的問題。

其實Spring為我們注入參數(shù)提供了這么多方法,那么這些方法必然有他們存在的道理,每個方法在某一問題上會有獨特的優(yōu)勢,我們只需要按照我們具體的使用需求選擇適合的方法來使用就好了,但一般不太推薦工廠方法注入。

以上就是動力節(jié)點小編介紹的"詳解Spring注入bean的幾種方式",希望對大家有幫助,想了解更多可查看Spring框架教程。動力節(jié)點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲欧美日韩综合一区久久 | 日韩大片高清播放器好 | 午夜影院啊啊啊 | 日本深夜18免费看片高清网 | 777久久| 日韩午夜剧场 | 中文字幕欧美日韩 | 美女bbbb精品视频 | 一区二区网站在线观看 | 欧美国产伦久久久久 | 免费久久久久 | 日本一区免费观看 | 成人免费观看www在线 | 免费色片 | 欧美色网络 | 99成人在线 | 国产bbw | 国产午夜毛片v一区二区三区 | xxxx日本在线播放免费不卡 | 欧美日韩亚洲无线码在线观看 | 国产精品麻豆综合在线 | 天天操精品视频 | 国产免费理论片在线观看 | 中文字幕在线网 | 中文字幕免费在线看 | 久久精品成人免费看 | 亚洲国产精品日韩高清秒播 | 91久久人澡人人添人人爽 | 就爱干草视频 | 一色屋成人免费精品网站 | 国产免费叼嘿在线观看 | 黄网免费在线观看 | 国产日本视频 | 亚洲欧美日韩国产精品网 | 国产精品手机在线亚洲 | 国产人成精品香港三级在 | 在线18av| 黄a视频| 久久久精品国产免费观看同学 | a色毛片免费视频 | 一级黄色片在线观看 |