(參考內(nèi)容)
Singleton 單例 在Spring IOC 容器僅存在一個(gè)Bean實(shí)例,Bean以單例方式存在,這個(gè)是默認(rèn)值。
prototype 原型 每次從容器調(diào)用bean時(shí),都會(huì)返回一個(gè)新的實(shí)例,也就是每次調(diào)用getBean()時(shí)都會(huì)實(shí)例化一個(gè)新的bean。
request 每次HTTP請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的Bean,該作用于僅適用于web環(huán)境
session 每個(gè)HTTP Session共享一個(gè)Bean,不同的Session使用不同的Bean,同樣只適用于web環(huán)境。
Global Session 一般作用于Portlet應(yīng)用環(huán)境,只作用于Web環(huán)境。
五種作用域中,其中request、session、global session三種作用域僅適用于web環(huán)境
bean對(duì)象無外乎是在以下兩個(gè)時(shí)刻進(jìn)行實(shí)例化的:
調(diào)用getBean()方法時(shí)。
Spring容器啟動(dòng)時(shí)。
bean的作用域?yàn)閟ingleton時(shí),bean對(duì)象是在Spring容器啟動(dòng)時(shí)就進(jìn)行創(chuàng)建。
但我們也可以指定bean節(jié)點(diǎn)的lazy-init=“true”來延遲初始化bean,這時(shí)候,只有第一次獲取bean會(huì)才初始化bean。
如果想對(duì)所有bean都應(yīng)用延遲初始化,可以在根節(jié)點(diǎn)beans設(shè)置default-lazy-init=“true”,如下:
<?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" default-lazy-init="true">
......
</beans>
bean的作用域?yàn)閜rototype時(shí),bean對(duì)象并不會(huì)在Spring容器啟動(dòng)時(shí)就進(jìn)行創(chuàng)建,bean對(duì)象將會(huì)在調(diào)用getBean()方法時(shí)進(jìn)行創(chuàng)建。
<?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="personService" class="cn.itcast.service.impl.PersonServiceBean" lazy-init="false"
init-method="init" destroy-method="destroy" />
</beans>
將會(huì)在bean初始化和銷毀的時(shí)候,執(zhí)行bean內(nèi)的方法。
試著思考這樣一個(gè)問題:bean對(duì)象到底是什么時(shí)候銷毀的呢?答案是:如果沒有人為地刪除它,默認(rèn)該bean一直在Spring容器中,也就是說隨著Spring容器的關(guān)閉,該bean才會(huì)被銷毀。
@Autowired默認(rèn)按類型裝配,@Resource默認(rèn)按名稱裝配,當(dāng)找不到與名稱匹配的bean才會(huì)按類型裝配
@Autowired + @Qualifier("...") = @Resource(name="...")
@Autowired注解是按類型裝配依賴對(duì)象,默認(rèn)情況下它要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它的required屬性為false。如:
@Autowired(required=true) @Qualifier("personDaoxxxx") private PersonDao personDao;
required=true代表字段personDao必須要注入值,也即是說在Spring容器中根據(jù)類型找不到對(duì)應(yīng)的bean,那就會(huì)報(bào)異常;
required=false意味著在Spring容器中根據(jù)類型找不到對(duì)應(yīng)的的bean,就會(huì)把該字段設(shè)為null。
依賴注入——自動(dòng)裝配依賴對(duì)象
<bean id="..." class="..." autowire="byType"/>
autowire屬性取值如下:
@Resource默認(rèn)按名稱裝配
@Resource(name="personDaoBean")
private PersonDao personDao; // 用于字段上
@Resource
public void setPersonDao(PersonDao personDao) { // 用于屬性的setter方法上
this.personDao = personDao;
}
注意:如果沒有指定name屬性,并且按照默認(rèn)的名稱仍然找不到依賴對(duì)象時(shí), @Resource注解會(huì)回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。
@Resource裝配順序
1. 如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常
2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常
3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個(gè),都會(huì)拋出異常
4. 如果既沒有指定name,又沒有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒有匹配,則回退為一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配;
舉例如下:
@Resource
private PersonDao personDao;
<bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean> 可以
<bean id="personDaoxxxx" class="cn.itcast.dao.impl.PersonDaoBean"></bean> 可以
@Resource(name="personDaoxxxx")
private PersonDao personDao;
<bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean> 不可以
<bean id="personDaoxxxx" class="cn.itcast.dao.impl.PersonDaoBean"></bean> 可以
網(wǎng)站標(biāo)題:springbean-創(chuàng)新互聯(lián)
瀏覽路徑:http://aaarwkj.com/article40/jsiho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、關(guān)鍵詞優(yōu)化、網(wǎng)站導(dǎo)航、網(wǎng)站維護(hù)、網(wǎng)站設(shè)計(jì)公司、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容