更新時間:2021-09-10 10:41:24 來源:動力節點 瀏覽1454次
首先,要學習Spring中的Bean的注入方式,就要先了解什么是依賴注入。依賴注入是指:讓調用類對某一接口的實現類的實現類的依賴關系由第三方注入,以此來消除調用類對某一接口實現類的依賴。
Spring容器中支持的依賴注入方式主要有屬性注入、構造函數注入、工廠方法注入。接下來將為大家詳細介紹這三種依賴注入的方式以及它們的具體配置方法。
屬性注入即通過setXXX( )方法注入bean的屬性值或依賴對象。由于屬性注入方式具有可選擇性和靈活性高的特點,因此它也是實際開發中最常用的注入方式。
Spring首先會調用bean的默認構造函數實例化bean對象,然后再通過反射的方法調用set方法來注入屬性值。
屬性注入要求bean提供一個默認的構造函數 ,并且得為需要注入的屬性提供 set方法 。
TIps:所謂默認的構造函數,即不帶參數的構造函數。如果類中沒有自定義任何構造函數,則系統(JVM)會自動生成一個不帶參的默認構造函數,如果類中顯式的自定義了有參數的構造函數,則系統就不會在自動生成默認構造函數,需要自己手動再加一個無參的構造函數。
下面通過一個實例來演示Spring中bean的屬性注入方式:
編寫一個user類:
package com.Kevin.bean;
/**
* 創建一個類測試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實現類中擁有與其對應的實現方法setUsername( )。
Tips:Spring只會檢查bean中是否含有setter方法,而對是否有對應的屬性變量則不作具體要求,但按照約定俗成的規則我們最好為其設定相應的屬性變量。
Spring中<property>標簽的命名規范:
Spring的<property>標簽所指定的屬性名稱和bean實現類的setter方法滿足Sun JavaBean的屬性命名規范,即XXX的屬性對應setXXX( )的方法。
一般情況下,java的屬性變量名都以小寫字母開頭,但考慮到一些特殊意義的英文縮略詞,java bean也允許一些大寫字母開頭的變量名。但必須滿足以下兩點:
變量的前兩個字母要么全部大寫,要么全部小寫;
但以一般編程習慣來說,屬性名最好全部使用小寫字母,方便編程和閱讀。
對于屬性注入方式來說,只能人為的在配置文件中提供保證,而無法在語法級別提供保證。此時就需要使用構造函數注入這種方式,以此來更好的滿足要求。
構造函數注入是除屬性注入之外的另一種常用的注入方式,它可以保證一些必要的屬性在bean實例化時就得到了設置,并在實例化后就可以使用。
使用構造函數注入的前提是: bean必須提供帶參的構造函數。
對于構造函數的注入,配置文件可以有以下幾種方式:
按類型匹配入參
按索引匹配入參
聯合使用類型和索引匹配入參
通過自身類型反射匹配入參
工廠方法是應用中被經常使用的設計模式,也是控制反轉和單實例設計思想的主要實現方法。工廠類負責創建一個或多個工廠類實例,工廠類方法一般以接口或抽象類變量的形式返回目標類實例。
工廠類對外屏蔽了目標類的實例化步驟,調用者甚至根本不用指定具體的目標類是什么。由于Spring容器以框架的方法提供工廠方法的功能,并以透明的方式開放給開發者。因此很少需要手工編寫工程方法。但在一些遺留系統或第三方類庫中還是會碰到工程方法,此時便可以使用Spring工廠注入的方法來進行Spring的注入。
Spring工廠注入的方法可以分為靜態和非靜態兩種。
(1)非靜態工廠方法
有些工廠方法是非靜態的,必須實例化工廠類之后才能調用工廠方法。下面通過一個實例來演示。
編寫工廠類:
package com.Kevin.factorybean;
/**
* 編寫工廠類測試非靜態工廠方法注入
* @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的工廠方法不是靜態的,因此需要先定義一個工廠類的bean,然后通過 factory-bean 屬性來引用工廠bean實例。再通過屬性 factory-method 來指定對應的工廠方法。
(2)靜態工廠方法
很多工廠類方法都是靜態的,這意味著無需創建工廠類實例的情況下就可以調用工廠類方法。因此靜態工程方法比非靜態工廠方法的調用更加方便簡潔。下面通過一個實例來演示靜態工廠方法。
編寫factory類:
package com.Kevin.factorybean;
/**
* 編寫工廠類測試靜態工廠方法注入
* @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提供了三種可供選擇的注入方式,但在實際應用中,我們究竟該選擇哪種注入方式,并沒有統一的標準,如下是一些可以參考的理由:
構造函數注入理由:
構造函數保證重要屬性預先設置;
無需提供每個屬性的setter方法,減少類的方法個數;
可以更好地封裝類變量,避免外部錯誤調用。
屬性注入理由:
屬性過多時,構造函數變的臃腫;
構造函數注入靈活性不強,有時需要為屬性注入null值;
多個構造函數時,配置上產生歧義,復雜度升高;
構造函數不利于類的繼承和擴展;
構造函數注入會引起循環依賴的問題。
其實Spring為我們注入參數提供了這么多方法,那么這些方法必然有他們存在的道理,每個方法在某一問題上會有獨特的優勢,我們只需要按照我們具體的使用需求選擇適合的方法來使用就好了,但一般不太推薦工廠方法注入。
以上就是動力節點小編介紹的"詳解Spring注入bean的幾種方式",希望對大家有幫助,想了解更多可查看Spring框架教程。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習