Spring 简明教程
Spring - Bean Scopes
在定义 <bean> 时,您可以选择声明该 bean 的作用域。例如,要强制 Spring 在每次需要一个 bean 实例时生成一个新的 bean 实例,您应该将 bean 的作用域属性声明为 prototype 。类似地,如果您希望 Spring 在每次需要一个 bean 实例时返回同一个 bean 实例,您应该将 bean 的作用域属性声明为 singleton 。
Spring 框架支持以下五个作用域,其中三个仅在您使用 web 感知 ApplicationContext 时可用。
Sr.No. |
Scope & Description |
1 |
singleton 此作用域将 bean 定义作用域设置为每个 Spring IoC 容器(默认值)的一个实例。 |
2 |
prototype 此作用域将单个 bean 定义作用域设置为具有任意数量的对象实例。 |
3 |
request 此作用域将 bean 定义作用域设置为 HTTP 请求。仅在 web 感知 Spring ApplicationContext 的上下文中有效。 |
4 |
session 此作用域将 bean 定义作用域设置为 HTTP 会话。仅在 web 感知 Spring ApplicationContext 的上下文中有效。 |
5 |
global-session 此作用域将 bean 定义作用域设置为全局 HTTP 会话。仅在 web 感知 Spring ApplicationContext 的上下文中有效。 |
在本章中,我们将讨论前两个作用域,其余三个将在我们讨论 web 感知 Spring ApplicationContext 时进行讨论。
The singleton scope
如果将作用域设置为 singleton,则 Spring IoC 容器会为该 bean 定义所定义的对象创建恰好一个实例。此单个实例存储在这些 singleton bean 的缓存中,并且对该已命名 bean 的所有后续请求和引用都会返回缓存对象。
默认作用域始终是单例。但是,当您只需要一个 bean 实例时,可以如以下代码片段所示在 bean 配置文件中设置 scope * property to *singleton −
<!-- A bean definition with singleton scope -->
<bean id = "..." class = "..." scope = "singleton">
<!-- collaborators and configuration for this bean go here -->
</bean>
Example
让我们准备一个可用的 Eclipse IDE,然后执行以下步骤来创建一个 Spring 应用程序−
Steps |
Description |
1 |
使用 SpringExample 创建一个项目,并在创建的项目 src 文件夹下创建 com.tutorialspoint 包。 |
2 |
使用 Add External JARs 选项添加必需的 Spring 库,如 Spring Hello World Example 章节中所述。 |
3 |
在 com.tutorialspoint 包下创建 Java 类 HelloWorld 和 MainApp。 |
4 |
在 src 文件夹下创建 Beans 配置文件 Beans.xml。 |
5 |
最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并按如下所述运行应用程序。 |
以下是 HelloWorld.java 文件的内容 −
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 文件的内容−
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();
}
}
以下是 singleton 作用域所需的配置文件 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>
完成源文件和 Bean 配置文件创建后,我们运行该应用程序。如果您的应用程序一切正常,它将打印以下消息−
Your Message : I'm object A
Your Message : I'm object A
The prototype scope
如果将作用域设置为 prototype,则 Spring IoC 容器会在每次对特定 bean 发出请求时为该对象创建一个新的 bean 实例。一般而言,将 prototype 作用域用于所有有状态 bean,将 singleton 作用域用于无状态 bean。
要定义 prototype 作用域,可以在 bean 配置文件中将属性 scope 设置为 prototype ,如以下代码片段所示 −
<!-- A bean definition with prototype scope -->
<bean id = "..." class = "..." scope = "prototype">
<!-- collaborators and configuration for this bean go here -->
</bean>
Example
让我们启动 Eclipse IDE 并按照以下步骤创建一个 Spring 应用程序 −
Steps |
Description |
1 |
使用 SpringExample 创建一个项目,并在创建的项目 src 文件夹下创建 com.tutorialspoint 包。 |
2 |
使用 Add External JARs 选项添加必需的 Spring 库,如 Spring Hello World Example 章节中所述。 |
3 |
在 com.tutorialspoint 包下创建 Java 类 HelloWorld 和 MainApp。 |
4 |
在 src 文件夹下创建 Beans 配置文件 Beans.xml。 |
5 |
最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并按如下所述运行应用程序。 |
以下是 HelloWorld.java 文件的内容
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 文件的内容−
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();
}
}
以下是 prototype 作用域所需的配置文件 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>
完成源文件和 Bean 配置文件创建后,我们运行该应用程序。如果您的应用程序一切正常,它将打印以下消息−
Your Message : I'm object A
Your Message : null