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