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ō)明
- xmlns:命名空間妻顶,后邊的是命名空間的值
- xmlns:xsi:什么xsi這個(gè)命名空間
- xsi:schemaLocation酸员,xsi有一個(gè)標(biāo)簽叫做 schemaLocation,指定約束文件的具體路徑
http://www.springframework.org/schema/beans(簡(jiǎn)稱(chēng)) http://www.springframework.org/schema/beans/spring-beans.xsd(地址)
3)beans里邊是beans的聲明
4)什么是bean:由Spring容器管理的java對(duì)象
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)建和管理的才菠。