Spring Bean Scopes作用域

来源:互联网 发布:淘宝助理导入快递模板 编辑:程序博客网 时间:2024/06/01 21:49

当定义一个Spring的<bean>,必须声明bean 作用域的选项。例如,要强制Spring需要产生一个新的bean实例,应该声明bean的scope属性为prototype。如果你希望Spring 每次都返回同一个bean实例,应该声明bean的作用域,方式类似属性是单例。

Spring框架支持以下五个作用域,其中三个只有当您使用Web感知的 ApplicationContext 可用。

范围描述singletonThis scopes the bean definition to a single instance per Spring IoC container (default).prototypeThis scopes a single bean definition to have any number of object instances.requestThis scopes a bean definition to an HTTP request. Only valid in the context of a web-aware Spring ApplicationContext.sessionThis scopes a bean definition to an HTTP session. Only valid in the context of a web-aware Spring ApplicationContext.global-sessionThis scopes a bean definition to a global HTTP session. Only valid in the context of a web-aware Spring ApplicationContext.

本章将讨论前两个范围和其余三将讨论的时候,我们将讨论有关Web感知Spring的ApplicationContext。

singleton作用域:

如果范围设置为单例,Spring IoC容器创建了一个由该bean定义的对象只有一个实例。这个单一实例存储在这样的单例bean的高速缓存,以及所有后续请求和引用针对该bean返回缓存对象。

默认范围是始终单例,但是当你需要bean的一个实例,可以设置的范围属性单例在bean配置文件中,如下图所示:

<!-- A bean definition with singleton scope --><bean id="..." class="..." scope="singleton">    <!-- collaborators and configuration for this bean go here --></bean>

示例:

让我们使用Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:

步骤描述1Create a project with a name SpringExample and create a package com.yiibai under the src folder in the created project.2Add required Spring libraries using Add External JARs option as explained in the Spring Hello World Example chapter.3Create Java classes HelloWorld and MainApp under the com.yiibai package.4Create Beans configuration file Beans.xml under the src folder.5The final step is to create the content of all the Java files and Bean Configuration file and run the application as explained below.

这里是HelloWorld.java 文件的内容:

package com.yiibai;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.yiibai;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.yiibai.HelloWorld"       scope="singleton">   </bean></beans>

一旦创建源代码和bean配置文件来完成,运行应用程序。如果一切顺利,这将打印以下信息:

Your Message : I'm object AYour Message : I'm object A

原型作用域:

如果范围设置为原型,那么Spring IoC容器创建对象的新的bean实例为每个特定的bean发出请求时的时间。作为一项规则,使用prototype作用域为所有状态的bean类和singleton作用域为无状态的bean。

要定义一个原型作用域,可以设置的范围属性为原型的bean配置文件中,如下图所示:

<!-- A bean definition with singleton scope --><bean id="..." class="..." scope="prototype">    <!-- collaborators and configuration for this bean go here --></bean>

示例:

让我们在地方工作的Eclipse IDE,然后按照下面的步骤来创建一个Spring应用程序:

步骤描述1Create a project with a name SpringExample and create a package com.yiibai under the src folder in the created project.2Add required Spring libraries using Add External JARs option as explained in the Spring Hello World Example chapter.3Create Java classes HelloWorld and MainApp under the com.yiibai package.4Create Beans configuration file Beans.xml under the src folder.5The final step is to create the content of all the Java files and Bean Configuration file and run the application as explained below.

这里是HelloWorld.java 文件的内容:

package com.yiibai;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.yiibai;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.yiibai.HelloWorld"       scope="prototype">   </bean></beans>

创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:

Your Message : I'm object AYour Message : null
0 0
原创粉丝点击