`
tsroom
  • 浏览: 1025 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

为Spring扩展Application Bean 作用域

阅读更多
除了Singleton和Prototype两个原生Bean作用域外,早在Spring2.0版本上,就增加了具有web生命周期的bean 作用域:request、session和 global session。但不支持ServletContext(即Web中Application)作用域。尽管Singleton有一定的全局作用意义,但在Sping容器中支持Application,以IOC方式注入和访问ServletContext中的Bean对象,对于WEB开发还是很有用处的。
本文利用Spring自定义作用域机制,扩展了其bean作用域。简单的实现了对Application作用域的支持。

Holder类,使用类静态变量方式持有ServletContext
package rtl.ioc.spring;

import javax.servlet.ServletContext;
public class ApplicationHolder{
	
  private static ServletContext ctx=null;
	
  public static void setApplication(ServletContext sctx){
	  ctx=sctx;
  }
  
  public static void setApplicationAttribute(String name,Object obj){
	  ctx.setAttribute(name, obj);
  }

  public static Object getApplicationAttribute(String name) {
    return ctx.getAttribute(name);
  }
  
  public static void  removeApplicationAttribute(String name) {
	 ctx.removeAttribute(name);
  }
}

ApplicationScope实现org.springframework.beans.factory.config.Scope (Bean作用域接口)
package rtl.ioc.spring;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

public class ApplicationScope implements Scope{
	
  public Object get(String name, ObjectFactory objectFactory){
    Object scopedObject = ApplicationHolder.getApplicationAttribute(name);
    if (scopedObject == null) {
      scopedObject = objectFactory.getObject();
      ApplicationHolder.setApplicationAttribute(name, scopedObject);
    }
    return scopedObject;
  }

  public Object remove(String name) {
	Object scopedObject = ApplicationHolder.getApplicationAttribute(name);
    if (scopedObject != null) {
    	ApplicationHolder.removeApplicationAttribute(name);
    	return scopedObject;
    }
    return null;
  }

  public void registerDestructionCallback(String name, Runnable callback){ }

  public String getConversationId() {
	return null;
  }

}

使用ServletContextListener向ApplicationHolder类注入ServletContext
package rtl.ioc.spring;

import javax.servlet.*;

public class ApplicationScopeListener implements ServletContextListener {

	public void contextInitialized(ServletContextEvent event){
		ApplicationHolder.setApplication(event.getServletContext());
	}

	public void contextDestroyed(ServletContextEvent event){}
}


使用CustomScopeConfigurer来进行声明式注册Application作用域
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="application">
                    <bean class="rtl.ioc.spring.ApplicationScope"/>
                </entry>
            </map>
        </property>
 </bean>


使用演示配置形如:
<bean id="ApplicationBean" class="demo.ApplicationBean" scope="application"></bean>











分享到:
评论
4 楼 cesymm 2011-03-17  
可以参考  org.springframework.web.filter.RequestContextFilter 源码
3 楼 3694826 2011-03-09  
richard_2010 写道
有什么作用?和singleton区别在哪里?
对了,spring中的singleton和单例模式有什么区别?

没有任何区别。
2 楼 richard_2010 2011-03-09  
有什么作用?和singleton区别在哪里?
对了,spring中的singleton和单例模式有什么区别?
1 楼 tsroom 2011-03-05  
大家很少回复啊,请大家给出意见和建议.并探讨Appliaction域的作用.

相关推荐

    Spring中Bean的作用域

    NULL 博文链接:https://huangminwen.iteye.com/blog/1486717

    spring-aware接口实现与bean作用域(spring多容器层面)

    关于`bean的作用域`,Spring支持多种Bean的作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。这些作用域定义了Bean的生命周期和创建行为: 1. **单例(Singleton)**:默认...

    Spring Bean的作用域.docx

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

    基于java的企业级应用开发:Bean的作用域.ppt

    在企业级应用开发中,Java 是一种广泛使用的编程语言,特别是在Spring框架的支持下,能够构建高效、可扩展的系统。Spring框架的核心特性之一是...选择正确的Bean作用域是实现高效且健壮的企业级应用开发的关键步骤。

    主要用于学习Spring IoC的配置,基于xml的组件类的作用域配置

    在Spring中,Bean可以有多种作用域,而作用域决定了该Bean是属于一个特定的实例,还是在多个实例之间共享。默认的作用域是singleton,意味着Spring容器中只会创建Bean的单个实例。然而,除了singleton之外,Spring还...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    Spring支持多种bean的作用域,如Singleton(单例)、Prototype(原型)、Request、Session等。理解这些作用域对于控制bean的生命周期至关重要。 总结来说,Spring Boot允许开发者轻松地在普通类中使用bean,通过...

    粗略实现spring创建bean

    - 作用域(Scope):还包括请求(Request)、会话(Session)、应用(Application)等Web容器特定的作用域。 4. Spring Bean 的依赖注入 - 构造器注入:通过带有参数的构造函数来设置Bean的依赖。 - setter注入...

    Spring Reference - Core Technologies.pdf

    Spring为Web应用定义了request、session、application和WebSocket作用域。 1.5.5 自定义作用域 Spring允许自定义作用域,开发者可以创建自己的作用域以及在自定义作用域中使用Bean。 1.6 自定义Bean的性质 Spring...

    spring bean加载

    - Singleton:Spring默认的Bean作用域,每个Bean只有一个实例。 - Prototype:每次请求都会创建一个新的Bean实例。 - Request:在一次HTTP请求中,每个Bean只有一个实例,适用于Web环境。 - Session:在一个...

    Spring官方文档之核心篇

    #### Bean作用域 Spring中的Bean可以拥有不同的作用域。作用域决定了该Bean的作用范围和生命周期。 - **单例作用域**:默认作用域,容器中只有一个共享的Bean实例。 - **原型作用域**:每次请求都会创建一个新的...

    Spring源码学习二:BeanDefinition解析1

    在Spring框架中,BeanDefinition是核心组件之一,它定义了bean的基本信息和元数据,包括bean的类、作用域、依赖关系、初始化方法等。在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,...

    spring 学习 springcore例子

    8. **Bean的作用域**:Spring Bean有多种作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)和全局会话(Global Session)。不同作用域的Bean有不同的生命周期和可见性。 9. **...

    基于注解与xml相结合方式下的组件类生命周期和作用域的配置

    在深入探讨Spring IoC配置中组件类的生命周期和作用域的配置方法之前,我们首先需要了解Spring框架的基本概念。Spring是一个开源的Java平台,它提供了全面的编程和配置模型,用于管理Java应用中的对象之间的依赖关系...

    spring技术详解

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

    二、Spring源码分析——BeanFactory

    4. **作用域管理**:支持单例(singleton)、原型(prototype)等多种bean的作用域。 5. **配置元数据**:可以读取XML、注解或基于Java的配置来管理bean。 三、BeanFactory与ApplicationContext的区别 虽然...

    spring-beans源码

    Spring支持五种Bean的作用域:单例(Singleton)、原型(Prototype)、请求(Request)、session(Session)和全局会话(Global Session)。不同的作用域决定了Bean的实例化策略和生命周期。 7. **Bean后处理器** ...

    Spring详解

    本篇文章将深入探讨Spring框架的核心特性,包括Spring容器、依赖注入(DI)以及不同类型的Bean作用域。 首先,Spring的核心是Spring容器,它负责管理和装配应用程序中的Java组件。容器主要有两种类型:BeanFactory...

    SpingIOC注入实例化bean

    Spring支持五种bean的作用域: - **单例(Singleton)**:容器中只有一个实例,所有请求都返回同一个bean。 - **原型(Prototype)**:每次请求都会创建一个新的bean实例。 - **请求(Request)**:在Web应用中,每个...

    Spring教材

    Spring 2.0和2.5引入了更多的bean作用域,除了原有的singleton(单例)和prototype(原型)之外,还包括session、request、globalSession等Web环境下的作用域,以及application作用域,使得对象的生命周期管理更加...

    Spring相关面试题.docx

    Spring Bean 的定义包含了 Bean 的基本信息,例如 Bean 的名称、类别、作用域等。 Bean 的定义和生命周期 21. 如何给 Spring 容器提供配置元数据? 可以使用 XML 文件或注解来提供配置元数据。 22. 你怎样定义类的...

Global site tag (gtag.js) - Google Analytics