Spring中bean的作用域(易懂版)
阿新 • • 發佈:2021-01-16
bean的作用域
作用域:用於確定Spring建立Bean的例項個數。
作用域類別 | 描述 |
---|---|
singleton | 單例的(預設的),使用singleton定義的Bean是單例的,每次呼叫getBean都是呼叫的同一個物件。只要IOC容器一建立就會建立Bean的例項。 |
prototype | 多例的,每次通過Spring IOC容器獲取prototype定義的Bean時,容器都將建立一個新的Bean例項。建立時不會例項該Bean,只有呼叫getBean方法時,才會例項化。 |
request | 作用於web的請求範圍,在每一次HTTP請求時,容器會返回Bean的同一個例項,對不同的HTTP請求則會產生一個新的Bean,而且該Bean僅在當前HTTP Request內有效。 |
session | 作用於web的會話範圍,在一次HTTP Session中,容器會返回該Bean的同一個例項,對不同的HTTP請求則會產生一個新的Bean,而且該Bean僅在當前HTTP Session內有效。 |
global-session | 作用於叢集環境的會話範圍(全域性會話範圍),在一個全域性的HTTP Session中,容器返回Bean的同一個例項。當不是叢集環境時,它就是session。 |
單例項(singleton)的bean
這種單例項的是預設的型別
使用singleton定義的Bean是單例的,每次呼叫getBean都是呼叫的同一個物件。只要IOC容器一建立就會建立Bean的例項。
隨便拿來一個Book類演示:
package com.Keafmd.spring5.collectiontype;
import java.util.List;
/**
* Keafmd
*
* @ClassName: Book
* @Description:
* @author: 牛哄哄的柯南
* @date: 2021-01-15 14:56
*/
public class Book {
private List< String> list;
public void setList(List<String> list) {
this.list = list;
}
public void test(){
System.out.println(list);
}
}
bean2.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"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!--設定為單例項,不寫預設的就是這種型別:scope="singleton"-->
<!--設定為多例項:scope="prototype"-->
<bean id="book" class="com.Keafmd.spring5.collectiontype.Book">
<property name="list" ref="bookList"></property>
</bean>
</beans>
測試程式碼:
package com.Keafmd.spring5.testdemo;
import com.Keafmd.spring5.bean.Orders;
import com.Keafmd.spring5.collectiontype.Book;
import com.Keafmd.spring5.collectiontype.Course;
import com.Keafmd.spring5.collectiontype.Stu;
import com.Keafmd.spring5.factorybean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Keafmd
*
* @ClassName: TestSpring5demo1
* @Description: 測試類
* @author: 牛哄哄的柯南
* @date: 2021-01-15 14:30
*/
public class TestSpring5demo1 {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Book book = context.getBean("book",Book.class);
Book book2 = context.getBean("book",Book.class);
System.out.println(book);
System.out.println(book2);
}
}
測試結果:
com.Keafmd.spring5.collectiontype.Book@376b4233
com.Keafmd.spring5.collectiontype.Book@376b4233
Process finished with exit code 0
輸出結果相同證明是同一個物件,證明是單例項的。
多例項(prototype)的bean
設定為多例項需要用到scope屬性,並且屬性值設為"prototype"。這樣就是多例的,每次通過Spring IOC容器獲取prototype定義的Bean時,容器都將建立一個新的Bean例項。建立時不會例項該Bean,只有呼叫getBean方法時,才會例項化。
Book類:
package com.Keafmd.spring5.collectiontype;
import java.util.List;
/**
* Keafmd
*
* @ClassName: Book
* @Description:
* @author: 牛哄哄的柯南
* @date: 2021-01-15 14:56
*/
public class Book {
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
public void test(){
System.out.println(list);
}
}
修改bean2.xml的bean的scope的值為prototype。
bean2.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"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!--設定為單例項,不寫預設的就是這種型別:scope="singleton"-->
<!--設定為多例項:scope="prototype"-->
<bean id="book" class="com.Keafmd.spring5.collectiontype.Book" scope="prototype">
<property name="list" ref="bookList"></property>
</bean>
</beans>
測試程式碼:
package com.Keafmd.spring5.testdemo;
import com.Keafmd.spring5.bean.Orders;
import com.Keafmd.spring5.collectiontype.Book;
import com.Keafmd.spring5.collectiontype.Course;
import com.Keafmd.spring5.collectiontype.Stu;
import com.Keafmd.spring5.factorybean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Keafmd
*
* @ClassName: TestSpring5demo1
* @Description: 測試類
* @author: 牛哄哄的柯南
* @date: 2021-01-15 14:30
*/
public class TestSpring5demo1 {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Book book = context.getBean("book",Book.class);
Book book2 = context.getBean("book",Book.class);
System.out.println(book);
System.out.println(book2);
}
}
測試結果:
com.Keafmd.spring5.collectiontype.Book@376b4233
com.Keafmd.spring5.collectiontype.Book@2fd66ad3
Process finished with exit code 0
輸出結果不同的,證明不是同一個物件,證明是多例項的。
看完如果對你有幫助,感謝點贊支援!
如果你是電腦端的話,看到右下角的 “一鍵三連” 了嗎,沒錯點它[哈哈]
加油!
共同努力!
Keafmd