# Spring DI 依賴(lài)注入有幾種方式颤难?

Spring 實(shí)例化 bean 的方式

- Set注入

- 構(gòu)造器注入

- 靜態(tài)工廠注入

- 實(shí)例化工廠注入

## 案例實(shí)操

#### Set注入

**xml配置(同時(shí)spring也提供了對(duì)于基本數(shù)據(jù)類(lèi)型的set注入方式)**

~~~ xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userDao" class="com.xxx.demo.UserDao"></bean>

<!-- setter注入 -->

<bean id="userService" class="com.xxx.demo.UserService">

? ? ? ? <!--ref是對(duì)于外部bean對(duì)象引用熔任,與被引用的bean對(duì)象的id保持一致-->

<property name="userDao" ref="userDao"></property>

</bean>

</beans>

~~~

**UserDao.java**

~~~ java

public class UserDao {

public String userLogin() {

return "我是UserDao中的userLogin()的方法";

}

}

~~~

**UserService.java**

~~~ java

public class UserService {

? ? //一定要提供屬性的setter方法

private UserDao userDao;

public void userlogin() {

String res=userDao.userLogin();

System.out.println(res);

}

public void setUserDao(UserDao userDao) {

this.userDao = userDao;

}

}

~~~

**App.java**

~~~ java

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

public static void main(String[] args) {

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");

UserService userService=applicationContext.getBean("userService", UserService.class);

userService.userlogin();

}

}

~~~

#### 構(gòu)造器注入

**xml配置(也提供對(duì)于基本數(shù)據(jù)類(lèi)型姑食、字符串等值的注入)**

~~~ xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userDao" class="com.xxx.demo.UserDao"></bean>

<!-- 構(gòu)造器注入 -->

<bean id="userServiceV2" class="com.xxx.demo.UserServiceV2">

<constructor-arg index="0" ref="userDao"></constructor-arg>

<constructor-arg index="1" value="印度三哥"></constructor-arg>

</bean>

</beans>

~~~

構(gòu)造器注入有三種形式:

index屬性為參數(shù)順序窍奋,如果只有一個(gè)參數(shù)index可以不設(shè)置。

name屬性根據(jù)構(gòu)造器中屬性的名字暖璧。

type屬性,是根據(jù)構(gòu)造器中屬性的類(lèi)型來(lái)匹配的君旦。如果相同類(lèi)型屬性不唯一澎办,注入的屬性按照順序注入進(jìn)來(lái)。

**UserServiceV2.java類(lèi)提供構(gòu)造函數(shù)**

~~~ java

/**

* 實(shí)現(xiàn)構(gòu)造器注入

* @author Best Liu

*

*/

public class UserServiceV2 {

private UserDao userDao;

private String name;

public void userlogin() {

String res=userDao.userLogin();

System.out.println(res);

System.out.println(name);

}

public UserServiceV2(UserDao userDao,String name) {

super();

this.userDao = userDao;

this.name = name;

}

}

~~~

#### 靜態(tài)工廠注入

**xml配置**

~~~ java

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 靜態(tài)工廠注入 -->

<bean id="userDao01" class="com.xxx.demo.StaticFactory" factory-method="createuserDao"></bean>

<bean id="userService01" class="com.xxx.demo.UserService">

<property name="userDao" ref="userDao01"></property>

</bean>

</beans>

~~~

**StaticFactory.java**

~~~ java

public class StaticFactory {

public static UserDao createuserDao(){

return new UserDao();

}

}

~~~

**UserService.java**

~~~ java

public class UserService {

private UserDao userDao;

public void userlogin() {

String res=userDao.userLogin();

System.out.println(res);

}

public void setUserDao(UserDao userDao) {

this.userDao = userDao;

}

}

~~~

**tips:靜態(tài)工廠注入就是IoC靜態(tài)工廠和DI的setter注入金砍,將需要注入的屬性對(duì)象利用靜態(tài)工廠創(chuàng)建出來(lái).**

#### 2.4 實(shí)例化工廠

**xml配置**

~~~ xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- 實(shí)例化工廠 -->

<bean id="instanceFactory" class="com.xxx.demo.InstanceFactory"></bean>

<bean id="userDao3" factory-bean="instanceFactory" factory-method="createUserDao"></bean>

<bean id="userService02" class="com.xxx.demo.UserService">

<property name="userDao" ref="userDao3"></property>

</bean>

</beans>

~~~

**InstanceFactory.java**

~~~ java

public class InstanceFactory {

public UserDao createUserDao(){

return new UserDao();

}

}

~~~

tips:重點(diǎn)掌握set局蚀,構(gòu)造器注入,工廠方式了解即可恕稠,實(shí)際開(kāi)發(fā)中基本使用set方式注入bean琅绅。

## 擴(kuò)展

### 循環(huán)依賴(lài)的問(wèn)題的產(chǎn)生

**Bean通過(guò)構(gòu)造器注入,之間彼此相互依賴(lài)對(duì)方導(dǎo)致bean無(wú)法實(shí)例化鹅巍。**

**注入的選擇:開(kāi)發(fā)項(xiàng)目中set方式注入首選**

使用構(gòu)造注入可以在構(gòu)建對(duì)象的同時(shí)一并完成依賴(lài)關(guān)系的建立千扶,對(duì)象一建立則所有的一切也就準(zhǔn)備好了,但如果要建立的對(duì)象關(guān)系很多骆捧,使用構(gòu)造注入會(huì)在構(gòu)建函數(shù)上留下一長(zhǎng)串的參數(shù)澎羞,且不易記憶,這時(shí)使用Set注入會(huì)是個(gè)不錯(cuò)的選擇敛苇。需要視頻配套資料或其他資料+我們小姐姐V lezijie007(加好友暗號(hào) 98 妆绞,不備注不加)

使用Set注入可以有明確的名稱(chēng),可以了解注入的對(duì)象會(huì)是什么枫攀,像setxxx()這樣的名稱(chēng)比記憶Constructor上某個(gè)參數(shù)的位置代表某個(gè)對(duì)象更好括饶。

**xml配置**

~~~ xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="goodsService" class="com.xxx.demo.GoodsService">

<!-- <constructor-arg index="0" ref="userService"></constructor-arg> -->

<property name="userService" ref="userService"></property>

</bean>

<bean id="userService" class="com.xxx.demo.UserService">

<!-- <constructor-arg index="0" ref="goodsService"></constructor-arg> -->

<property name="goodsService" ref="goodsService"></property>

</bean>

</beans>

~~~

**GoodsService.java**

~~~ java

public class GoodsService {

private UserService userService;

/*public GoodsService(UserService userService) {

super();

this.userService = userService;

}*/

public void setUserService(UserService userService) {

this.userService = userService;

}

}

~~~

**UserService.java**

~~~ java

public class UserService {

private GoodsService goodsService;

/* public UserService(GoodsService goodsService) {

super();

this.goodsService = goodsService;

}

*/

public void setGoodsService(GoodsService goodsService) {

this.goodsService = goodsService;

}

}

~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市来涨,隨后出現(xiàn)的幾起案子图焰,更是在濱河造成了極大的恐慌,老刑警劉巖蹦掐,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楞泼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笤闯,警方通過(guò)查閱死者的電腦和手機(jī)堕阔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颗味,“玉大人超陆,你說(shuō)我怎么就攤上這事。” “怎么了时呀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵张漂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谨娜,道長(zhǎng)航攒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任趴梢,我火速辦了婚禮漠畜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坞靶。我一直安慰自己憔狞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布彰阴。 她就那樣靜靜地躺著瘾敢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尿这。 梳的紋絲不亂的頭發(fā)上簇抵,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音射众,去河邊找鬼正压。 笑死,一個(gè)胖子當(dāng)著我的面吹牛责球,可吹牛的內(nèi)容都是我干的焦履。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雏逾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘉裤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起栖博,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屑宠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仇让,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體典奉,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年丧叽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卫玖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踊淳,死狀恐怖假瞬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤脱茉,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布剪芥,位于F島的核電站,受9級(jí)特大地震影響琴许,放射性物質(zhì)發(fā)生泄漏税肪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一榜田、第九天 我趴在偏房一處隱蔽的房頂上張望益兄。 院中可真熱鬧,春花似錦串慰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至神汹,卻和暖如春庆捺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屁魏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工滔以, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氓拼。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓你画,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桃漾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坏匪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359