IOC(概念和原理)
什么是IOC?
- 反轉(zhuǎn)控制,把對(duì)象創(chuàng)建和對(duì)象之間的調(diào)用過(guò)程,交給Spring進(jìn)行管理
- 使用IOC目的:為了耦合度降低
IOC過(guò)程:(降低耦合度)
// 第一步:xml配置文件,配置創(chuàng)建的對(duì)象
<bean id="dao" class="com.mfei.fun.UserDao"></bean>
// 第二步:有service和dao類。創(chuàng)建工廠類
class UserFactory {
public static UserDao getDao() {
String classValue - class屬性值;
Class class = Class.forName(classValue);
return (UserDao)class.newInstance();
}
}
IOC接口
- IOC思想基于IOC容器完成,IOC容器底層就是對(duì)象工廠
- Spring提供IOC容器實(shí)現(xiàn)兩種方式(兩個(gè)接口)
- BeanFactory:IOC容器基本實(shí)現(xiàn),是Spring內(nèi)部的使用接口,不提供開發(fā)人員進(jìn)行使用
- 加載配置文件時(shí)不會(huì)創(chuàng)建對(duì)象,在獲取(/ 使用)對(duì)象才去創(chuàng)建對(duì)象
- ApplicationContext:BeanFactory接口的子接口,提供更多更強(qiáng)大的功能。
- 加載配置文件的時(shí)候就會(huì)把配置文件對(duì)象進(jìn)行創(chuàng)建。
- 思考:哪個(gè)更好?把費(fèi)時(shí)費(fèi)力的操作,在啟動(dòng)的時(shí)候就創(chuàng)建好。
- BeanFactory:IOC容器基本實(shí)現(xiàn),是Spring內(nèi)部的使用接口,不提供開發(fā)人員進(jìn)行使用
IOC操作 Bean管理
什么是Bean管理?(兩個(gè)操作)
- Spring創(chuàng)建對(duì)象
- Spring注入屬性
Bean管理操作有兩種方法
-
基于xml配置文件方式實(shí)現(xiàn)
<bean id="dao" class="com.mfei.fun.UserDao"></bean>
id屬性:唯一標(biāo)識(shí)
class屬性:類全路徑
創(chuàng)建對(duì)象的時(shí)候,默認(rèn)執(zhí)行無(wú)參構(gòu)造方法完成對(duì)象創(chuàng)建
==屬性注入==
第一種:使用set方法
<bean ….>
<property name="bname" value="mfei"></propetry>
第二種:使用有參構(gòu)造注入
1、創(chuàng)建有參構(gòu)造器
2、配置文件中
<bean id="dao" class="com.mfei.fun.UserDao">
<constructor-arg name="ooname" value="abc"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
基于注解方式實(shí)現(xiàn)
IOC操作Bean管理(FactoryBean)
- ==Spring有兩種類型bean,一種是普通bean,另外一種工廠bean(FactoryBean)==
- ==普通bean:在配置文件中定義bean類型就是返回類型==
- ==工廠bean:在配置文件定義bean類型可以和返回類型不一樣==
- ==第一步 創(chuàng)建類,讓這個(gè)類作為工廠bean,實(shí)現(xiàn)接口FactoryBean==
- ==第二步 實(shí)現(xiàn)接口里面的方法,在實(shí)現(xiàn)的方法中定義返回的類型==
IOC操作Bean管理(bean作用域)
在Spring中,創(chuàng)建bean是單實(shí)例還是多實(shí)例
默認(rèn)是單實(shí)例對(duì)象
-
==如何設(shè)置是單實(shí)例和多實(shí)例==
在Spring配置文件bean標(biāo)簽里面有屬性(scope)用于設(shè)置單實(shí)例還是多實(shí)例
-
scope屬性值
第一個(gè)值 默認(rèn)值:singleton,表示單實(shí)例對(duì)象
prototype,表示是多實(shí)例對(duì)象
<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"> <property name="list" ref="bookList"></property> </bean>
-
singleton和prototype區(qū)別
- singleton單實(shí)例,prototype多實(shí)例
- 設(shè)置scope值是singleton時(shí)候,加載spring配置文件時(shí)候就會(huì)創(chuàng)建單實(shí)例對(duì)象
- 設(shè)置scope值是prototype時(shí)候,不是在加載spring配置文件時(shí)候創(chuàng)建對(duì)象,在調(diào)用getBean方法時(shí)候創(chuàng)建多實(shí)例對(duì)象
request 一次請(qǐng)求(了解)
session 一次對(duì)話(了解)
IOC操作Bean管理(bean生命周期)
- 通過(guò)構(gòu)造器創(chuàng)建bean實(shí)例(無(wú)參構(gòu)造)
- 為bean的屬性設(shè)置值和對(duì)其他bean引用(調(diào)用set方法)
- 調(diào)用bean的初始化方法(需要進(jìn)行配置初始化方法)
- bean可以使用了(對(duì)象獲取到了)
- 當(dāng)容器關(guān)閉時(shí)候,調(diào)用bean的銷毀方法(需要進(jìn)行配置銷毀的方法)
==后置方法(配置后置處理器)==
IOC操作Bean管理(xml自動(dòng)裝配)
- 什么是自動(dòng)裝配
- 根據(jù)指定裝配規(guī)則(屬性名或者屬性類型),Spring自動(dòng)將匹配的屬性值進(jìn)行注入
- bean標(biāo)簽中有屬性autowire
- byName 根據(jù)名稱注入
- byType根據(jù)類型注入
IOC操作Bean管理(外部屬性文件)
*引入context名稱空間
IOC操作Bean管理(注解注入)
- @Autowired:根據(jù)屬性類型進(jìn)行自動(dòng)裝配
- @Qualifier:根據(jù)屬性名稱進(jìn)行注入
- @Resource:可以根據(jù)類型注入,可有根據(jù)名稱注入
- @Value:注入普通類型屬性
@Configuration:作為配置類,替代xml文件