第二章 IoC控制反轉(zhuǎn)

2.1 概念

IoC Inversion of Control :控制反轉(zhuǎn)犯助,是一個(gè)理論栗竖,一個(gè)指導(dǎo)思想暑脆。指導(dǎo)開(kāi)發(fā)人員如何使用對(duì)象去管理對(duì)象。把對(duì)象的創(chuàng)建狐肢、屬性賦值添吗、對(duì)象的生命周期都交給代碼之外的容器管理。(應(yīng)該用容器來(lái)管理對(duì)象)份名。
1)IoC分為:控制和反轉(zhuǎn)

  • 控制:對(duì)象創(chuàng)建碟联、屬性賦值妓美、對(duì)象生命周期的管理。
  • 反轉(zhuǎn):
    正轉(zhuǎn):開(kāi)發(fā)人員在代碼中鲤孵,使用new構(gòu)造方法創(chuàng)建對(duì)象部脚,開(kāi)發(fā)人員掌握了對(duì)象的創(chuàng)建、屬性賦值裤纹、對(duì)象從開(kāi)始到銷(xiāo)毀的全部過(guò)程委刘,開(kāi)發(fā)人員對(duì)對(duì)象全部控制。鹰椒、
    反轉(zhuǎn):把開(kāi)發(fā)人員管理對(duì)象的權(quán)限轉(zhuǎn)移給了代碼之外的容器來(lái)實(shí)現(xiàn)锡移,由容器來(lái)完成對(duì)對(duì)象的管理。
    通過(guò)容器可以使用容器中的對(duì)象(容器已經(jīng)創(chuàng)建了對(duì)象漆际,對(duì)象屬性賦值了淆珊,對(duì)象也組裝好了)。spring就是一個(gè)容器奸汇,可以管理對(duì)象施符、創(chuàng)建對(duì)象,給屬性賦值擂找。
    2)IoC的技術(shù)實(shí)現(xiàn)
    DI(依賴(lài)注入):dependency indjection,是IoC的一種技術(shù)實(shí)現(xiàn)戳吝。程序只需要提供要使用的對(duì)象的名稱(chēng)就可以了,對(duì)象如果創(chuàng)建贯涎、如何從容器中查找听哭、獲取都由容器內(nèi)部自己實(shí)現(xiàn)。
    3)Spring 框架使用的DI實(shí)現(xiàn)IoC
    通過(guò)spring框架塘雳,只需要提供要使用的對(duì)象的名稱(chēng)就可以了陆盘。從容器中獲取名稱(chēng)對(duì)應(yīng)的對(duì)象。Spring的底層是使用的反射機(jī)制败明,通過(guò)反射創(chuàng)建對(duì)象隘马、給屬性賦值。

2.2 Spring的配置文件

<?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">
</beans>
spring的標(biāo)準(zhǔn)配置文件:
1)根標(biāo)簽是beans
2)beans后邊的是約束文件說(shuō)明

2.3 Spring容器創(chuàng)建對(duì)象的特點(diǎn)

1盈包、容器對(duì)象ApplicationContext:接口
通過(guò)ApplicationContext對(duì)象沸呐,獲取要使用的其他java對(duì)象,執(zhí)行g(shù)etBean("id")
2呢燥、Spring默認(rèn)是調(diào)用類(lèi)的無(wú)參構(gòu)造方法崭添,創(chuàng)建對(duì)象
3、Spring讀取配置文件叛氨,一次創(chuàng)建好所有的java對(duì)象呼渣,都放在map中棘伴。

2.4 給屬性賦值

Spring調(diào)用類(lèi)的無(wú)參構(gòu)造方法,創(chuàng)建對(duì)象屁置,對(duì)象創(chuàng)建后給屬性賦值焊夸。給屬性賦值可以使用:

  • xml配置文件中的標(biāo)簽和屬性
  • 使用注解
    DI分類(lèi): set注入,也叫做設(shè)置注入蓝角、構(gòu)造注入

2.4.1基于xml的DI

在xml的配置文件中阱穗,來(lái)完成對(duì)象的創(chuàng)建,屬性賦值
1)set注入使鹅,也叫作設(shè)置注入
概念:Spring調(diào)用類(lèi)中的set方法揪阶,在set方法中可以完成屬性賦值,推薦使用

 <!--簡(jiǎn)單類(lèi)型的設(shè)值注入-->
    <bean id="mySchool" class="com.wh.ch02dixml.ba02.School">
        <property name="name" value="北京大學(xué)"/>
        <property name="address" value="海淀區(qū)"/>
    </bean>
<!-- 引用類(lèi)型的設(shè)值注入-->
  <bean id="myStudent" class="com.wh.ch02dixml.ba02.Student">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>

        <!--引用類(lèi)型的賦值-->
        <property name="school" ref="mySchool"></property>
    </bean>

2)構(gòu)造注入
Spring調(diào)用勒種的有參的構(gòu)造方法患朱,在創(chuàng)建對(duì)象的同時(shí)鲁僚,給屬性賦值(name ,index,省略index)

   <!--構(gòu)造注入-->
    <bean id="myStudent" class="com.wh.ch02dixml.ba03.Student">
        <constructor-arg name="myName" index="0" value="李四"/>
        <constructor-arg name="myAge" index="1" value="20"/>
        <constructor-arg name="mySchool" index="2" ref="mySchool"/>
    </bean>

    <!--聲明school-->
    <bean id="mySchool" class="com.wh.ch02dixml.ba03.School">
        <property name="name" value="北京大學(xué)"/>
        <property name="address" value="海淀區(qū)"/>
    </bean>

3)引用類(lèi)型的自動(dòng)注入
概念:Spring可以根據(jù)某些規(guī)則給引用類(lèi)型完成賦值,只對(duì)引用類(lèi)型有效裁厅。規(guī)則byName冰沙,byType

  • byName(按名稱(chēng)注入):java類(lèi)中引用類(lèi)型屬性名稱(chēng)和Spring容器中bean的id名稱(chēng)一樣,而且數(shù)據(jù)類(lèi)型也是一樣的执虹,這些bean能夠賦值給引用類(lèi)型拓挥。
  <!--byName自動(dòng)注入-->
    <bean id="myStudent" class="com.wh.ch02dixml.ba04.Student" autowire="byName">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
    </bean>

    <!--聲明school-->
    <bean id="school" class="com.wh.ch02dixml.ba04.School">
        <property name="name" value="清華大學(xué)"/>
        <property name="address" value="海淀區(qū)"/>
    </bean>
  • byType(按類(lèi)型注入):java類(lèi)中引用類(lèi)型的數(shù)據(jù)類(lèi)型和Spring容器中bean的class值是同源關(guān)系的,這樣的bean賦值給引用類(lèi)型
    注意:符合條件的對(duì)象只能有一個(gè)声畏,多余一個(gè)是報(bào)錯(cuò)的

    <!--byName自動(dòng)注入-->
    <bean id="myStudent" class="com.wh.ch02dixml.ba05.Student" autowire="byType">
        <property name="name" value="張三"/>
        <property name="age" value="26"/>
    </bean>

    <!--聲明school-->
    <bean id="mySchool" class="com.wh.ch02dixml.ba05.School">
        <property name="name" value="航空大學(xué)"/>
        <property name="address" value="海淀區(qū)"/>
    </bean>

    <!--聲明school的子類(lèi)-->
<!--    <bean id="primarySchool" class="com.wh.ch02dixml.ba05.PrimarySchool">
        <property name="name" value="北京大興小學(xué)"/>
        <property name="address" value="大興區(qū)"/>
    </bean>-->

4)項(xiàng)目中使用多個(gè)spring配置文件
方式:

  • 按照功能模塊撞叽,一個(gè)模塊一個(gè)配置文件
    -按照功能分,數(shù)據(jù)庫(kù)操作相關(guān)的類(lèi)放在一個(gè)配置文件插龄,service放在一個(gè)配置模塊,配置redis科展、事務(wù)等等均牢。
    Spring管理多個(gè)配置文件,常用的是包含關(guān)系的配置文件才睹,項(xiàng)目中由一個(gè)總的配置文件徘跪,里邊由import標(biāo)簽包含其他的多個(gè)配置文件。
    語(yǔ)法:
總的xml
<import resource="其他文件的路徑">

關(guān)鍵字:classpath:表示類(lèi)的路徑琅攘,也就是類(lèi)文件class文件所在的目錄垮庐。spring到類(lèi)的路徑中加載文件。
什么時(shí)候使用classpath:在一個(gè)文件中使用其他的文件坞琴,需要使用classpath
<!--
        當(dāng)前是總的文件哨查,目的是包含其他多個(gè)配置文件,一般不聲明bean
        語(yǔ)法:
        <import resource="classpath:其他文件路徑" />
        classpath:表示類(lèi)路徑剧辐,類(lèi)文件所在的目錄寒亥,spring是通過(guò)類(lèi)路徑加載配置文件
 -->
<!--    <import resource="classpath:ba06/spring-school.xml"/>-->
<!--    <import resource="classpath:ba06/spring-student.xml"/>-->

<!--
    包含關(guān)系的配置文件邮府,可使用通配符(*:表示任意字符)
    注意:總的文件名稱(chēng),不能包含在通配符范圍內(nèi)
    <import resource="classpath:ba06/spring-*.xml" />
-->
    <import resource="classpath:ba06/spring-*.xml" />

2.4.2基于注解的DI

基于注解的DI:使用spring提供的注解溉奕,完成Java對(duì)象創(chuàng)建褂傀、屬性賦值。
注解使用的核心步驟

  • 在源代碼中加入注解加勤,例如:@component
  • 在spring的配置文件中仙辟,加入組件掃描器的標(biāo)簽:
    <context:component-scan base-package="注解所在包名"/>
    1、創(chuàng)建對(duì)象的注解
    @Component
    @Respository
    @Service
    @Controller

2鳄梅、簡(jiǎn)單類(lèi)型屬性賦值
@Value

3欺嗤、引用類(lèi)型賦值

  • @AutoWired:spring提供的注解哈误,支持byName渣刷、byType.默認(rèn)byType, @Autowired + @Qualifier 使用byName

  • @Resource:來(lái)自JDK的注解,給引用類(lèi)型類(lèi)型賦值的谤专,默認(rèn)是byName校赤。先使用byName,再用byType
    @Resource(name="bean的名稱(chēng)"):只使用byName注入

2.5 IoC總結(jié)

IoC:管理對(duì)象的吆玖,把對(duì)象放在容器中,創(chuàng)建马篮、賦值沾乘、管理依賴(lài)關(guān)系。通過(guò)管理對(duì)象浑测,實(shí)現(xiàn)解耦合翅阵。IoC解決處理業(yè)務(wù)邏輯對(duì)象之間的耦合關(guān)系,也就是service和dao之間的解耦合

spring作為容器迁央,管理什么對(duì)象掷匠?

  • service、dao
  • 工具類(lèi)對(duì)象
    不適合岖圈?
  • 實(shí)體類(lèi)讹语。(數(shù)據(jù)是動(dòng)態(tài)的,數(shù)據(jù)庫(kù)查出來(lái)的蜂科、前端讀取的用戶數(shù)據(jù)之類(lèi)的)
  • servlet顽决、listener、filter等web中的對(duì)象导匣。他們是tomcat創(chuàng)建和管理的才菠。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贡定,隨后出現(xiàn)的幾起案子赋访,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件进每,死亡現(xiàn)場(chǎng)離奇詭異汹粤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)田晚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)嘱兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贤徒,你說(shuō)我怎么就攤上這事芹壕。” “怎么了接奈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵踢涌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我序宦,道長(zhǎng)睁壁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任互捌,我火速辦了婚禮潘明,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秕噪。我一直安慰自己钳降,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布腌巾。 她就那樣靜靜地躺著遂填,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澈蝙。 梳的紋絲不亂的頭發(fā)上吓坚,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音碉克,去河邊找鬼凌唬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛漏麦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播况褪,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撕贞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了测垛?” 一聲冷哼從身側(cè)響起捏膨,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后号涯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體目胡,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年链快,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了誉己。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡域蜗,死狀恐怖巨双,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霉祸,我是刑警寧澤筑累,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站丝蹭,受9級(jí)特大地震影響慢宗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奔穿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一镜沽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巫橄,春花似錦淘邻、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至彩倚,卻和暖如春筹我,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帆离。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蔬蕊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哥谷。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓岸夯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親们妥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猜扮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容