定義<bean>時(shí)肃拜,可以選擇聲明該bean的作用域垛贤。例如,要強(qiáng)制Spring每次需要一個(gè)新的bean實(shí)例時(shí)躺同,應(yīng)將bean的scope屬性聲明為prototype阁猜。同樣,如果希望Spring每次需要一個(gè)實(shí)例時(shí)都返回相同的bean實(shí)例蹋艺,則應(yīng)將bean的scope屬性聲明為singleton剃袍。
Spring框架支持以下五個(gè)范圍,其中三個(gè)僅在使用可感知Web的ApplicationContext時(shí)才可用捎谨。
范圍和說明 |
singleton 這會(huì)將bean定義的范圍限定為每個(gè)Spring IoC容器一個(gè)實(shí)例(默認(rèn))笛园。 |
prototype 這將單個(gè)bean定義的范圍限定為具有任意數(shù)量的對象實(shí)例隘击。 |
request 這將bean定義的范圍限定為HTTP請求。僅在可感知網(wǎng)絡(luò)的Spring ApplicationContext上下文中有效研铆。 |
session 這將bean定義的作用域限定為HTTP會(huì)話。僅在可感知網(wǎng)絡(luò)的Spring ApplicationContext上下文中有效州叠。 |
global-session 這將bean定義的作用域限定為全局HTTP會(huì)話棵红。僅在可感知網(wǎng)絡(luò)的Spring ApplicationContext上下文中有效。 |
在文咧栗,將討論前兩個(gè)范圍逆甜。
singleton范圍
如果將范圍設(shè)置為單例,則Spring IoC容器將創(chuàng)建該bean定義所定義的對象的一個(gè)實(shí)例致板。該單個(gè)實(shí)例存儲(chǔ)在此類單例bean的高速緩存中交煞,并且對該命名bean的所有后續(xù)請求和引用都返回該高速緩存的對象。
默認(rèn)范圍始終為單例斟或。但是素征,當(dāng)您只需要一個(gè)bean的一個(gè)實(shí)例時(shí),可以在bean配置文件中將scope屬性設(shè)置為singleton萝挤,如以下代碼片段所示-
<!-- A bean definition with singleton scope -->
<bean id = "..." class = "..." scope = "singleton">
<!-- collaborators and configuration for this bean go here -->
</bean>
例子
并執(zhí)行以下步驟來創(chuàng)建一個(gè)Spring應(yīng)用程序:
這是HelloWorld.java文件的內(nèi)容-
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
以下是MainApp.java文件的內(nèi)容-
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
以下是單例作用域所需的配置文件Beans.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-3.0.xsd">
<bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope = "singleton">
</bean>
</beans>
完成創(chuàng)建源和Bean配置文件后御毅,運(yùn)行該應(yīng)用程序。它將顯示以下消息-
Your Message : I'm object A
Your Message : I'm object A
prototype范圍
如果將范圍設(shè)置為prototype怜珍,則每次請求該特定bean時(shí)端蛆,Spring IoC容器都會(huì)創(chuàng)建該對象的新bean實(shí)例。通常酥泛,將原型作用域用于所有有狀態(tài)的Bean今豆,將單例作用域用于無狀態(tài)的Bean。
要定義prototype范圍柔袁,可以在bean配置文件中將scope屬性設(shè)置為prototype呆躲,如以下代碼片段所示-
<!-- A bean definition with prototype scope -->
<bean id = "..." class = "..." scope = "prototype">
<!-- collaborators and configuration for this bean go here -->
</bean>
例子
讓我們準(zhǔn)備好運(yùn)行中的Eclipse IDE,并按照以下步驟創(chuàng)建一個(gè)Spring應(yīng)用程序-
HelloWorld.java文件的內(nèi)容
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
}
MainApp.java文件的內(nèi)容-
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
以下是配置文件Beans.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-3.0.xsd">
<bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope = "prototype">
</bean>
</beans>
完成創(chuàng)建源和Bean配置文件后瘦馍,運(yùn)行該應(yīng)用程序歼秽。它將顯示以下消息-
Your Message : I'm object A
Your Message : null
本文使用 文章同步助手 同步