bean的作用域——Spring對bean的管理(二)
本章案例基於上節,看不懂的請先看上節——bean的三種初始化方式:
https://blog.csdn.net/qq_34598667/article/details/83246492
Bean的作用域
bean的作用域:當在 Spring 中定義一個 bean 時,你必須宣告該 bean 的作用域的選項。
作用域屬性:scope
值:
1、singleton:在spring IoC容器僅存在一個Bean例項,Bean以單例方式存在,預設值
2、prototype:每次從容器中呼叫Bean時,都返回一個新的例項.
3、request:每次HTTP請求都會建立一個新的Bean
4、session:同一個HTTP Session共享一個Bean
5、global-session:一般用於Portlet應用環境,全域性Session物件,
注:後三種僅限於Web環境(WebApplicationContext容器)
下面我們來測試前兩種
singleton
在每個Spring IoC容器中,一個bean定義只有一個物件例項。
以上節案例為基礎,我修改spring.xml配置檔案如下:
<?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="demo" class="com.oak.junit.day01.Demo"></bean>
</beans>
使用預設作用域singleton
在測試類中測試
@Test
public void testScope(){
//例項化Spring容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
//獲取demo
Demo demo1=ctx.getBean("demo" ,Demo.class);
Demo demo2=ctx.getBean("demo",Demo.class);
System.out.println(demo1==demo2);//true
}
測試,控制檯輸出true,說明了預設情況下bean交給Spring容器管理之後,這個bean就是一個單例項(單例模式)的,即每次呼叫getBean()方法,獲取到的都是同一個bean例項。
prototype
現有一個新需求,要求每次呼叫getBean()都能得到一個新的物件。修改spring.xml配置檔案,設定作用域scope=“prototype” ,程式碼如下:
<?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="demo" class="com.oak.junit.day01.Demo" scope="prototype"></bean>
</beans>
測試類方法不用改,直接測試:
控制檯輸出false,證實了若bean的作用域置為prototype,那麼每次呼叫getBean()方法從Spring容器獲取bean都將是新的物件。
下一章:Spring對bean的管理(三)——bean的生命週期