`
ponlya
  • 浏览: 164315 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring3之 bean 作用域scope

阅读更多

Bean scopes 作用域

5:singleton,prototype,request,session,global session

singleton 是默认的作用域,容器只产生一个实例,只要调用的id相同,返回的实例就是同一个;

prototype 每次调用返回的是不同的实例;

Request, session, and global session scopes 这三个是WEB方面使用的,使用基于webSpring ApplicationContext实现(XmlWebApplicationContext

前二个

com.spring305.test.scope.po.SingletonScope.java

public class SingletonScope {

	private int id = (int) (100 * Math.random());

	public void printID() {
		System.out.println(SingletonScope.class + " id=" + id);
	}

}

 com.spring305.test.scope.po.PrototypeScope.java

 

public class PrototypeScope {
	private int id = (int) (100 * Math.random());

	public void printID() {
		System.out.println(PrototypeScope.class + " id=" + id);
	}
}

 

src/testScope.xml

<bean id="singletonScope" class="com.spring305.test.scope.po.SingletonScope"></bean>
<bean id="prototypeScope" class="com.spring305.test.scope.po.PrototypeScope" scope="prototype"></bean>

 

测试:

@Test
public  void testSingletonProtoType(){
	ApplicationContext ctx = new ClassPathXmlApplicationContext("testScope.xml");
	SingletonScope singletonScope1 = ctx.getBean("singletonScope",SingletonScope.class);
	SingletonScope singletonScope2 = ctx.getBean("singletonScope",SingletonScope.class);
	PrototypeScope prototypeScope1 = ctx.getBean("prototypeScope",PrototypeScope.class);
	PrototypeScope prototypeScope2 = ctx.getBean("prototypeScope",PrototypeScope.class);
	singletonScope1.printID();
	singletonScope2.printID();
		
	prototypeScope1.printID();
	prototypeScope2.printID();
}

 

得到结果:

class com.spring305.test.scope.po.SingletonScope id=89
class com.spring305.test.scope.po.SingletonScope id=89
class com.spring305.test.scope.po.PrototypeScope id=12
class com.spring305.test.scope.po.PrototypeScope id=50

 singleton的值没有变化,而prototype的变化

 

再看后三种:

web.xml中加入spring Listener

<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<!-- classpath:applicationContext.xml -->
		<param-value>/WEB-INF/testScope.xml</param-value>
	</context-param>

	<listener>
		<listener-class>
			org.springframework.web.context.request.RequestContextListener
		</listener-class>
	</listener>

	<servlet>
		<servlet-name>ScopeTest</servlet-name>
		<servlet-class>
			com.spring305.test.scope.po.ScopeTest
		</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>ScopeTest</servlet-name>
		<url-pattern>/ScopeTest</url-pattern>
	</servlet-mapping>

 /WEB-INF/testScope.xml

<bean id="singletonScope" class="com.spring305.test.scope.po.SingletonScope"></bean>
<bean id="prototypeScope" class="com.spring305.test.scope.po.PrototypeScope" scope="prototype"></bean>
<bean id="requestScopeT" class="com.spring305.test.scope.po.RequestScope" scope="request"></bean>
<bean id="sessionScopeT" class="com.spring305.test.scope.po.SessionScope" scope="session"></bean>
<bean id="globalSessionScope" class="com.spring305.test.scope.po.GlobalSessionScope" scope="globalSession"></bean>

 servlet doGet内容如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

                response.setContentType("text/html");
	PrintWriter out = response.getWriter();
	System.out.println("in get");
	ServletContext context = getServletContext();

		ApplicationContext   ctx   =   null; 
        if   (ctx   ==   null)       
        {       
        	ctx   =   WebApplicationContextUtils.getRequiredWebApplicationContext(context);       
        }       
       
        /**
         *     SingletonScope singletonScope1 = ctx.getBean("singletonScope",SingletonScope.class);
                SingletonScope singletonScope2 = ctx.getBean("singletonScope",SingletonScope.class);
	PrototypeScope prototypeScope1 = ctx.getBean("prototypeScope",PrototypeScope.class);
	PrototypeScope prototypeScope2 = ctx.getBean("prototypeScope",PrototypeScope.class);
	singletonScope1.printID();
	singletonScope2.printID();
		
	prototypeScope1.printID();
	prototypeScope2.printID();
         */
        
	RequestScope requestScope = (RequestScope) ctx.getBean("requestScopeT");
	requestScope.printID();

	SessionScope sessionScope = (SessionScope) ctx.getBean("sessionScopeT");
	sessionScope.printID();
	GlobalSessionScope gScope = (GlobalSessionScope)ctx.getBean("globalSessionScope",GlobalSessionScope.class);
	gScope.printID();
		
	out.println("123");
	out.flush();
	out.close();
}

 同一浏览器刷新二次得到结果:

in get
class com.spring305.test.scope.po.RequestScope id=11
class com.spring305.test.scope.po.SessionScope id=50
class com.spring305.test.scope.po.GlobalSessionScope id=70
in get
class com.spring305.test.scope.po.RequestScope id=92
class com.spring305.test.scope.po.SessionScope id=50
class com.spring305.test.scope.po.GlobalSessionScope id=70

 可见,除了requet的值变化了,session,globalsession的都没有变

换个浏览器刷新下servlet

in get
class com.spring305.test.scope.po.RequestScope id=96
class com.spring305.test.scope.po.SessionScope id=89
class com.spring305.test.scope.po.GlobalSessionScope id=38

 相对而言,值都变化了,那么globalsession为什么也会变?官方给出解释:

The global session scope is similar to the standard HTTP Session scope (described above), and
applies only in the context of portlet-based web applications

 基于portlet的web应用中才有意义.

 

<!--EndFragment-->
分享到:
评论

相关推荐

    spring bean 的作用域(scope)

    spring bean 的作用域(scope), SPringle bean的作用域

    spring的bean作用域

    在Spring中,有五种主要的Bean作用域: 1. **Singleton作用域**: - Singleton是Spring默认的Bean作用域。这意味着,无论何时,只要Spring容器被初始化,它都会创建一个Bean实例,并将其缓存起来。后续对相同ID的...

    详解Spring中bean的作用域

    换言之,当把一个 bean 定义设置为 singleton 作用域时,Spring IoC 容器只会创建该 bean 定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该 bean 的后续请求和引用都将返回被...

    spring Bean的作用域之间有什么区别1

    Spring Bean 的作用域之间有什么区别:Bean的作用域: 可以通过scope 属性来指定bean的作用域 ①singleton: 默认值。当IOC容器

    Spring实战之Bean的作用域singleton和prototype用法分析

    在Spring框架中,Bean的作用域是决定如何管理和创建Bean实例的关键概念。本篇文章将深入探讨两种主要的作用域:singleton和prototype,并通过实例分析其用法和注意事项。 首先,`singleton`是Spring默认的作用域,...

    Spring容器中Bean的作用域编程开发技术共3页.pd

    3. **请求(Request)作用域**:在Web应用中,当Bean的作用域设定为请求时,Spring会在每个HTTP请求中创建一个Bean实例。这意味着在同一个请求内,所有对Bean的引用都指向同一个实例,而不同的请求会有不同的实例。 ...

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

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

    详解Spring中bean的scope以后使用

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

    Spring Bean的作用域.docx

    Spring提供了五种不同的Bean作用域,每种都有其特定的使用场景和行为。 1. **Singleton作用域**:这是Spring的默认作用域,意味着无论何时从容器中请求一个特定的Bean,都会返回同一个实例。在配置文件中,可以使用...

    JSP 中Spring Bean 的作用域详解

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

    深入了解Spring中Bean的作用域和生命周期

    在 Spring 配置文件中,可以使用 `&lt;bean&gt;` 元素的 `scope` 属性将 Bean 的作用域定义成 singleton。 ```xml &lt;bean id="person" class="com.mengma.scope.Person" scope="singleton"/&gt; ``` 2. Prototype 作用域 ...

    SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    SPRING FRAMEWORK BEAN作用域和生命周期原理解析 Spring Framework 是一个流行的 Java Web 应用程序框架,它提供了一个强大的依赖注入机制,称为 Bean 容器。Bean 容器管理着应用程序中的所有对象,并提供了一些...

    浅谈spring中scope作用域

    spring 中的 scope 作用域是指在spring 框架中,bean 的实例化和生命周期的管理。Scope 作用域决定了 bean 的实例化方式、生命周期和作用域。 singleton 作用域 ----------------- 在 spring 中,默认的作用域是 ...

    Spring实战之协调作用域不同步的Bean操作示例

    在Spring框架中, Bean的作用域(Scope)是指Bean的生命周期范围。 Spring框架提供了五种作用域:Singleton(单例)、Prototype(原型)、Request(请求)、Session(会话)和GlobalSession(全局会话)。其中,...

    尚学堂_Spring_0600_IOC_Bean_Scope

    此外,Spring还提供了自定义Scope的机制,开发者可以根据需求定义自己的Bean作用域。 为了深入学习这个主题,可以参考提供的博文链接(虽然这里没有给出具体的链接内容,通常这些链接会包含博主的个人理解和实践...

    Spring之核心容器bean

    BeanFactory是Spring的基础容器,它提供bean的实例化、作用域、依赖注入、生命周期管理等功能。ApplicationContext则是在BeanFactory基础上扩展,增加了更多企业级服务,如消息处理、国际化、应用事件等。 **Bean的...

    SSH笔记-bean的作用域

    在`SSHnote_Spring_6_Scope`这个文件中,可能包含了关于如何在XML配置文件中定义不同作用域的Bean,以及如何在代码中注入和使用这些Bean的示例和解释。通过学习这部分内容,开发者可以更好地掌握Spring框架的核心...

    spring bean的生命周期

    3. **作用域** - **Singleton**:Spring容器中只会存在一个Bean实例,所有对Bean的请求都会返回同一个实例。 - **Prototype**:每次请求都会创建一个新的Bean实例。 - **Request**:在Web应用中,每个HTTP请求...

    Spring Bean 加载顺序 .

    3. **Bean的作用域**: 在注册时,Spring会根据@Bean、@Scope等注解确定Bean的作用域。默认情况下,Bean是单例(Singleton),但也可以配置为原型(Prototype)或其他作用域。 4. **Bean的依赖解析**: Spring会...

Global site tag (gtag.js) - Google Analytics