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