除了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>
分享到:
相关推荐
NULL 博文链接:https://huangminwen.iteye.com/blog/1486717
关于`bean的作用域`,Spring支持多种Bean的作用域,包括单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。这些作用域定义了Bean的生命周期和创建行为: 1. **单例(Singleton)**:默认...
Spring提供了五种不同的Bean作用域,每种都有其特定的使用场景和行为。 1. **Singleton作用域**:这是Spring的默认作用域,意味着无论何时从容器中请求一个特定的Bean,都会返回同一个实例。在配置文件中,可以使用...
在企业级应用开发中,Java 是一种广泛使用的编程语言,特别是在Spring框架的支持下,能够构建高效、可扩展的系统。Spring框架的核心特性之一是...选择正确的Bean作用域是实现高效且健壮的企业级应用开发的关键步骤。
在Spring中,Bean可以有多种作用域,而作用域决定了该Bean是属于一个特定的实例,还是在多个实例之间共享。默认的作用域是singleton,意味着Spring容器中只会创建Bean的单个实例。然而,除了singleton之外,Spring还...
Spring支持多种bean的作用域,如Singleton(单例)、Prototype(原型)、Request、Session等。理解这些作用域对于控制bean的生命周期至关重要。 总结来说,Spring Boot允许开发者轻松地在普通类中使用bean,通过...
- 作用域(Scope):还包括请求(Request)、会话(Session)、应用(Application)等Web容器特定的作用域。 4. Spring Bean 的依赖注入 - 构造器注入:通过带有参数的构造函数来设置Bean的依赖。 - setter注入...
Spring为Web应用定义了request、session、application和WebSocket作用域。 1.5.5 自定义作用域 Spring允许自定义作用域,开发者可以创建自己的作用域以及在自定义作用域中使用Bean。 1.6 自定义Bean的性质 Spring...
- Singleton:Spring默认的Bean作用域,每个Bean只有一个实例。 - Prototype:每次请求都会创建一个新的Bean实例。 - Request:在一次HTTP请求中,每个Bean只有一个实例,适用于Web环境。 - Session:在一个...
#### Bean作用域 Spring中的Bean可以拥有不同的作用域。作用域决定了该Bean的作用范围和生命周期。 - **单例作用域**:默认作用域,容器中只有一个共享的Bean实例。 - **原型作用域**:每次请求都会创建一个新的...
在Spring框架中,BeanDefinition是核心组件之一,它定义了bean的基本信息和元数据,包括bean的类、作用域、依赖关系、初始化方法等。在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,...
8. **Bean的作用域**:Spring Bean有多种作用域,如单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)和全局会话(Global Session)。不同作用域的Bean有不同的生命周期和可见性。 9. **...
在深入探讨Spring IoC配置中组件类的生命周期和作用域的配置方法之前,我们首先需要了解Spring框架的基本概念。Spring是一个开源的Java平台,它提供了全面的编程和配置模型,用于管理Java应用中的对象之间的依赖关系...
Spring容器中Bean的作用域有四种:singleton、prototype、request和session。singleton是单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例。prototype是原型模式,每次通过容器的getBean...
4. **作用域管理**:支持单例(singleton)、原型(prototype)等多种bean的作用域。 5. **配置元数据**:可以读取XML、注解或基于Java的配置来管理bean。 三、BeanFactory与ApplicationContext的区别 虽然...
Spring支持五种Bean的作用域:单例(Singleton)、原型(Prototype)、请求(Request)、session(Session)和全局会话(Global Session)。不同的作用域决定了Bean的实例化策略和生命周期。 7. **Bean后处理器** ...
本篇文章将深入探讨Spring框架的核心特性,包括Spring容器、依赖注入(DI)以及不同类型的Bean作用域。 首先,Spring的核心是Spring容器,它负责管理和装配应用程序中的Java组件。容器主要有两种类型:BeanFactory...
Spring支持五种bean的作用域: - **单例(Singleton)**:容器中只有一个实例,所有请求都返回同一个bean。 - **原型(Prototype)**:每次请求都会创建一个新的bean实例。 - **请求(Request)**:在Web应用中,每个...
Spring 2.0和2.5引入了更多的bean作用域,除了原有的singleton(单例)和prototype(原型)之外,还包括session、request、globalSession等Web环境下的作用域,以及application作用域,使得对象的生命周期管理更加...
Spring Bean 的定义包含了 Bean 的基本信息,例如 Bean 的名称、类别、作用域等。 Bean 的定义和生命周期 21. 如何给 Spring 容器提供配置元数据? 可以使用 XML 文件或注解来提供配置元数据。 22. 你怎样定义类的...