什么是Bean的作用域呢?
? 我們知道變量的作用域:在作用域范圍內(nèi)可以訪問(wèn)到該變量,在作用域范圍外則不能訪問(wèn)到該變量,這個(gè)是變量的作用域,但是Bean的作用域就和作用范圍不太一樣了
==Bean的作用域:==Bean在Spring中的某種行為模式,那什么是行為模式呢?Bean都有哪些行為模式呢,我們舉個(gè)栗子來(lái)說(shuō)明這個(gè)問(wèn)題:
User類:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-ZJZf91Z3-1669874907222)(https://hao-typora.oss-cn-beijing.aliyuncs.com/img/image-20221130183146524.png)]
1??向Spring中存儲(chǔ)User實(shí)例:
package bit.controller;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
@Controller
public class UserController1 {@Bean(value = "student_user")
public User user1(){User user = new User();
user.setId(2);
user.setName("李四");
user.setAge(10);
return user;
}
}
2??將Spring中的User實(shí)例注入到ScopeController1中:
package bit.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class ScopeController1 {@Autowired
private User user;
public void doController(){System.out.println("controller1");
System.out.println("原對(duì)象:"+user);
user.setName("王五");
System.out.println("修改后對(duì)象:"+user);
}
}
2??將Spring中的User實(shí)例注入到ScopeController2中:
package bit.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class ScopeController2 {
@Autowired
private User user;
public void doController(){
System.out.println("controller2");
System.out.println(user);
}
}
3??從Spring中分別取出兩個(gè)controller實(shí)例,分別調(diào)用doController方法:
4??結(jié)果:
在ScopeController1的doController方法中修改了User對(duì)象的名字,但是在ScopeController2的doController方法中打印的對(duì)象的信息恰好是ScopeController1修改后的結(jié)果,并不是原始的對(duì)象:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-TGsHXDLa-1669874907224)(https://hao-typora.oss-cn-beijing.aliyuncs.com/img/image-20221130182941999.png)]
5??原因:
==其實(shí)在Spring中存儲(chǔ)的對(duì)象默認(rèn)是單例的,==存儲(chǔ)的User實(shí)例只有一個(gè),雖然User實(shí)例要注入到兩個(gè)類中,但是注入兩個(gè)類中的User實(shí)例是同一個(gè),所以才會(huì)出現(xiàn)在ScopeController1中修改了User對(duì)象屬性,ScopeController2中的User對(duì)象屬性同樣也會(huì)修改。
??那在Spring中既然有單例,那就有多例,多例就是注入到不同對(duì)象的User實(shí)例不是同一個(gè)對(duì)象,是兩個(gè)不同的對(duì)象,單例有單例的好處:?jiǎn)卫矢?,因?yàn)閱卫粍?chuàng)建一個(gè)對(duì)象,多例有多例的適用場(chǎng)景,有的時(shí)候就是需要注入的不是同一個(gè)對(duì)象,那就是需要用多例。所以到底用單例還是用多例,需要看場(chǎng)景。
存入Spring中的對(duì)象是單例還是多例,這個(gè)就叫做不同的行為模式,也就是不同的作用域
Bean作用域類型在Spring中,Bean總共有6種作用域:
最后四種是基于SpringMVC生效的,在當(dāng)前的Spring core項(xiàng)目中只有前兩種生效
1??singleton:該作用域下的Bean在Spring中只有一個(gè)實(shí)例,通常無(wú)狀態(tài)的Bean使用該作用域,無(wú)狀態(tài)表示Bean的屬性不需要改變
2??prototype:該作用域下的Bean在Spring中有多個(gè)實(shí)例,每次注入對(duì)象注入的都是新創(chuàng)建的對(duì)象,通常在有狀態(tài)的Bean使用該作用域
3??request:每次http請(qǐng)求會(huì)創(chuàng)建新的實(shí)例,一次請(qǐng)求和響應(yīng)共享Bean,限定在SpringMVC中使用
4??session:在一個(gè)http session中定義一個(gè)Bean實(shí)例,限定SpringMVC中使用
后兩種并不常用,在此就不介紹了。
更改Bean的作用域package bit.controller;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller
public class UserController1 {
//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //方式一
@Scope("prototype") //方式二
@Bean(value = "student_user")
public User user1(){
User user = new User();
user.setId(2);
user.setName("李四");
user.setAge(10);
return user;
}
}
使用@Scope注解即可修改Bean的作用域:
方式一:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
方式二:@Scope(“prototype”)
Spring執(zhí)行流程:Spring執(zhí)行流程:?jiǎn)?dòng)Spring容器 ->掃描配置文件并實(shí)例化Bean(真正在堆上創(chuàng)建出對(duì)象)->將Bean注冊(cè)到Spring中(存對(duì)象)->將Bean裝配到需要的類中(其實(shí)就是對(duì)象注入)
Bean的生命周期所謂生命周期指的是從對(duì)象創(chuàng)建到對(duì)象銷毀的這個(gè)過(guò)程。
Bean的生命周期大體可以分為一下5個(gè)步驟:
? 3.1.執(zhí)行各種通知
? 3.2.初始化的前置方法
? 3.3.初始化方法
? 3.4初始化的后置方法
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱:【Spring】Bean作用域和生命周期-創(chuàng)新互聯(lián)
分享鏈接:http://chinadenli.net/article16/ddepdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、建站公司、ChatGPT、網(wǎng)站策劃、電子商務(wù)、全網(wǎng)營(yí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í)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容