1. 程式人生 > >bean的作用域——Spring對bean的管理(二)

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的生命週期