`

详解Spring中bean的作用域

阅读更多
singleton
返回bean的同一个实例,也是默认的作用域。无回话状态使用该作用域
prototype
每次请求时都新建一个实例有回话状态的时候使用该作用域

singleton和prototye的举例
1)新建类:UserService 和UserFactory
package cmo.spring.service;
public class UserService {
public void print(){
System.out.println("bean配置方式一");
}
}



package cmo.spring.service;
public class UserFactory {
public User createUser(){
return new User();
}
}
class User{
public void print(){
System.out.println("实例化工厂方法");
}
}
2)在spring.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-2.5.xsd">
<bean id="userService" class="cmo.spring.service.UserService"
scope="singleton"></bean>
<bean id="userFactory" class="cmo.spring.service.UserFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="createUser" scope="prototype"></bean>
</beans>
3)编写测试类

package cmo.spring.service;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo2 {
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");

/**
* bean的作用域默认为singleton模式即scope="singleton",每次获取的对象都一样
*
*/
UserService us = (UserService)ac.getBean("userService");
UserService us2 = (UserService)ac.getBean("userService");
System.out.println(us == us2);
/**
* 设置bean id=user 中scope="prototype" 即每次获取的对象不一样
*/
User user = (User)ac.getBean("user");
User user2 = (User)ac.getBean("user");
System.out.println(user == user2);
}
}

4)测试结果:

request
针对每次HTTP请求,Spring容器会根据Bean的定义创建一个全新的Bean实例, 且该Bean实例仅在当前HTTP request内有效,因此可以根据需要放心地更改所建实例的内部状态, 而其他请求中根据Bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的Bean实例将被销毁。该作用域仅在基于web的Spring ApplicationContext情形下有效。
例如:
Java代码 
1. scope="request"/> 
session
  针对某个HTTP Session,Spring容器会根据Bean定义创建一个全新的Bean实例,且该Bean实例仅在当前HTTP Session内有效。 与request作用域一样,我们可以根据需要放心地更改所创建实例的内部状态,而别的HTTP Session中根据Bean定义创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的Bean实例也会被废弃掉。该作用域仅在基于Web的Spring ApplicationContext情形下有效。
例如:
global session
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的Web应用中才有意义。portlet规范定义了全局Session的概念,它被所有构成某个portlet Web应用的各种不同的portlet所共享。在global session作用域中定义的Bean被限定于全局portlet Session的生命周期范围内。如果我们是在编写一个标准的基于Servlet的Web应用,并且定义了一个或多个具有global session作用域的Bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。该作用域仅在基于Web的Spring ApplicationContext情形下有效。
例如:
Java代码 
1. scope="globalSession"/> 

分享到:
评论

相关推荐

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...

    Spring 的bean的作用域总结

    Spring 的bean的作用域总结,详细的总结了 Spring 的bean的作用域

    详解Spring中bean的scope以后使用

    ### Spring框架中Bean的作用域详解 #### 一、引言 在Spring框架中,Bean的作用域(scope)是一项非常重要的特性,它决定了...合理地利用Bean作用域不仅可以提升应用程序的性能,还能增强代码的可维护性和可扩展性。

    JSP 中Spring Bean 的作用域详解

    JSP 中Spring Bean 的作用域详解 Bean元素有一个scope属性,用于定义Bean的作用域,该属性有如下五个值: 1&gt;singleton: 单例模式,在整个spring IOC容器中,单例模式作用域的Bean都将只生成一个实例。一般Spring...

    详解Spring中bean实例化的三种方式

    在Spring框架中,Bean的实例化是其核心功能之一,用于管理对象的生命周期和依赖关系。本文将详细探讨Spring中bean实例化的三种主要方式:普通构造方法创建、静态工厂创建和实例工厂创建。 1. 普通构造方法创建: 这...

    简单了解spring bean作用域属性singleton和prototype的区别

    Spring Bean作用域属性singleton和prototype的区别详解 Spring Framework中,Bean的作用域属性是指Bean实例的生命周期和作用域。Spring提供了五种作用域:singleton、prototype、request、session和global session...

    普元eos-springbean开发

    - **开发SpringBean**:根据业务需求编写具体的SpringBean实现,包括定义Bean的类型、作用域等。 #### HelloWorld案例开发 在学习SpringBean的开发过程中,最经典的莫过于HelloWorld案例了。该案例主要用于演示...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    但是,Spring 框架中不能解决非单例属性之外的循环依赖、构造器的循环依赖和prototype 作用域循环依赖。 在 Spring 框架中,Bean 的生命周期是一个重要的概念。Bean 的生命周期流程包括实例化、依赖注入、初始化、...

    spring入门教程之bean的继承与自动装配详解

    例如,`singleton`作用域的Bean在容器中只有一个实例,而`prototype`作用域的Bean每次请求都会创建新的实例。 总的来说,Spring Bean的继承与自动装配是提升代码复用性和简化配置的重要机制。通过理解并熟练运用...

    详解Spring Bean 之间的特殊关系

    总之,Spring Bean之间的特殊关系丰富多样,涵盖了继承、前置依赖、引用以及更复杂的工厂Bean、代理Bean、作用域和事件监听等,这些特性使得Spring能够灵活地管理和协调Bean之间的协作,从而构建出复杂的系统架构。

    详解 Spring 3.0 基于 Annotation 的依赖注入实现

    若需改变作用域,可以使用 `@Scope` 注解,如 `@Scope("prototype")` 表示原型作用域,每次请求都会创建一个新的 Bean 实例。 8. **配置元数据增强**: - `@Configuration` 和 `@Bean` 注解可以用来创建更复杂的...

    spring入门学习-3、Bean装配(XML).pdf

    Bean的作用域定义了Bean的生命周期以及Spring容器如何管理这些Bean的实例。Spring提供了多种作用域: 1. **Singleton**:单例模式,是Spring默认的作用域。在整个应用期间,Spring IoC容器只会为每个Bean定义创建一...

    spring技术详解

    Spring容器中Bean的作用域有四种:singleton、prototype、request和session。singleton是单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。prototype是原型模式,每次通过容器的getBean...

    Spring_IOC详解.pdf

    - **Singleton**:这是Spring中Bean的默认作用域。当一个Bean被声明为singleton时,Spring容器只会创建一个实例并将其保存在缓存中,后续对该Bean的请求都将返回同一个实例。这种方式有利于资源的共享和状态的一致性...

    SpringBoot (4.71G)精华详解

    1.Spring核心讲解与内容详述.mp4;`-{0B:r2E;]$u+m 2.Spring源码环境搭建与执行流程解析.mp4/j1};W;T$w4J8L2C5B.s 3.Spring核心组件装配流程解析.mp4)v!aq1n6}(D*K'b+V[1a ...15.Spring对象属性赋值与作用域源码解

    Spring基于xml文件配置Bean过程详解

    其中,id属性用于指定Bean的唯一标识,class属性用于指定Bean的类名,scope属性用于指定Bean的作用域。 例如: ``` &lt;bean id="helloWorld" class="com.gong.spring.beans.HelloWorld"&gt; ...

    Spring装配Bean教程之XML安装配置bean详解

    此外,XML配置还支持许多其他特性,如`init-method`和`destroy-method`用于指定Bean的初始化和销毁方法,`scope`属性用于设置Bean的作用域(如单例、原型等),以及`&lt;import&gt;`元素用于导入其他配置文件。 虽然现代...

Global site tag (gtag.js) - Google Analytics