目錄
什么是作用域呢 ?
那什么又是Spring Bean的作用域呢 ?
Spring框架默認Bean作用域是什么呢 ?
Spring Bean的作用域都有哪些呢 ?
如何設置Bean作用域
在JavaSE中,作用域就是指一個變量可生效的范圍. 就比如一個變量的作用域是方法的代碼塊的范圍,只在方法內部生效.
那什么又是Spring Bean的作用域呢 ?我來給一下官方的定義: Spring Bean的作用域是指Bean在整個框架中的某種行為模式.
看著這官方定義是有點懵 啥叫行為模式.
那就在舉一個例子 : Singleton是單例作用域,那就是指對于一個Bean,它在整個Spring框架中只存在一份,是全局的共享的,如果要操作這個Bean,所有人都操作這一份Bean.
也就是當一個人將這個Bean被修改了,其他人讀取到的就是被修改之后的值.
Spring框架默認Bean作用域是什么呢 ?我們來實戰演練一把,通過這個示例就可以知道Spring默認Bean 作用域是什么了.
有一個Bean為commonBean,假設張三來寫一個類來初始化這個Bean然后將Bean存儲到Spring中,李四去新創建一個對象來引用這個公共Bean(commonBean),然后使用并修改,王五要使用這個公共的Bean.
commonBean
public class CommonBean {
//創建一個公共的對象供給兩個人去使用
private String name;
private int age;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "CommonBean{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
'}';
}
}
張三來寫一個類來初始化這個Bean然后將Bean存儲到Spring中
@Controller
public class CommonScope {
//公共的類->供給其他人使用
//使用Bean注解將公共類返回的公共Bean存到Spring中
@Bean
public CommonBean doCommonBean(){
CommonBean commonBean = new CommonBean();
commonBean.setName("Java");
commonBean.setAge(19);
commonBean.setId(2000);
return commonBean;
}
}
李四去新創建一個對象來引用這個公共Bean(commonBean),然后使用并修改
@Controller
public class ScopeController1 {
@Autowired
private CommonBean commonBean;
public void doScopeController1() {
//李四自己創建一個對象引用公共的Bean
CommonBean commonBean1 = commonBean;
System.out.println("修改前的數據" + commonBean);
commonBean1.setName("C++");
System.out.println("修改后的數據" + commonBean1);
}
}
王五要使用這個公共的Bean.
@Controller
public class ScopeController2 {
@Autowired
private CommonBean commonBean;
public void doScopeController2(){
System.out.println("使用公共的Bean信息為 : " + commonBean);
}
}
啟動類進行使用
public class App {
//啟動類
public static void main(String[] args) {
//獲取到SpringContext上下文對象
ApplicationContext context1 = new ClassPathXmlApplicationContext
("spring-config.xml");
System.out.println("=================================");
ScopeController1 scopeController1 = context1.getBean("scopeController1", ScopeController1.class);
scopeController1.doScopeController1();
System.out.println("=================================");
ScopeController2 scopeController2 = context1.getBean("scopeController2", ScopeController2.class);
scopeController2.doScopeController2();
}
}
這個時候就會有情況發生我們接下來看運行結果
所以從這里就可以知道Spring框架默認Bean的作用域就是單例作用域.
Spring Bean的作用域都有哪些呢 ?Spring一共有6種作用域.Spring在為Bean初始化的時候就會設置作用域.
分別為下面6種作用域
單例作用域是Spring默認的作用域.
單例作用域下 : Bean在SpringIOC容器只存在一個實例,也就是獲取Bean(context.getBean())和注入/裝配Bean(比如AutoWired注入3)操作Bean的都是同一個Bean
適用場景 : 單例作用域一般適用于無狀態的Bean(Bean的狀態不需要更新).
多例作用域也叫原型作用域
對于一個Bean,每次訪問這個Bean都會創建新的實例.
也就是在Spring中獲取Bean(context.getBean())或者注入Bean(AutoWired注入Bean)操作的這個Bean都是新創建的Bean
適用場景 : 多例作用域一般適用于有狀態的Bean(Bean的狀態需要更新).
在請求作用域下,每次HTTP請求都會創建新的Bean實例.
這個與prototype類似 但是不相同 prototype是每次訪問Bean就創建,而request是每次HTTP請求創建新的實例(每次HTTP請求也可能訪問多個Bean)
適用場景 : 請求作用域在Spring MVC場景下才能夠生效 適用于一次HTTP請求共享Bean
在會話作用域下,每次session會話都會創建一個新的實例
適用場景 : 請求作用域在Spring MVC場景下才能夠生效,適用于在一次會話共享Bean
在一個Http Servlet Context 中創建一個實例
適用場景 : 請求作用域在Spring MVC場景下才能夠生效,適用于Web應用的上下文信息
在一個HTTP WebSocket的生命周期中,創建新的實例
適用場景 : 請求作用域在Spring MVC場景下才能夠生效,WebSocket的每次會話中,保存了?個Map結構的頭信息,將?來包裹客戶端消息頭。第?次初始化后,直到WebSocket結束都是同?個Bean
在Bean初始化的時候,就會為Bean設置其作用域.
Spring共有6種作用域
其中單例作用域和多例作用域在Spring框架中使用
請求作用域,會話作用域,全局作用域,WebSocket 只有在SpringMVC框架中才會生效.
如何設置Bean作用域有兩種方式設置Bean的作用域
第一種是直接設置值
比如我們來設置多例作用域
第二種是通過枚舉的方式
比如我們來設置多例作用域
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文題目:SpringBean作用域-創新互聯
文章URL:http://vcdvsql.cn/article12/ddjogc.html
成都網站建設公司_創新互聯,為您提供網站建設、自適應網站、建站公司、網站設計、網站維護、關鍵詞優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯