`
demojava
  • 浏览: 548885 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring bean 自定义作用域

    博客分类:
  • JAVA
 
阅读更多

一般都知道spring2.x bean的作用域

Bean作用域

作用域 描述

singleton

在每个Spring IoC容器中一个bean定义对应一个对象实例。

prototype

一个bean定义对应多个对象实例。

request

在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。

session

在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session

在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。

看完官网文档明白了,spring2.xbean的作用域可以自定义作用域,甚至重新定义现有的作用域(不提倡这么做,而且你不能覆盖内置的singletonprototype作用域)。

spring bean 自定义作用域

作用域由接口org.springframework.beans.factory.config.Scope定义。

要将你自己的自定义作用域集成到Spring容器中,需要实现该接口。它本身非常简单,只有两个方法,分别用于底层存储机制获取和删除对象。自定义作用域可能超出了本参考手册的讨论范围,但你可以参考一下Spring提供的Scope实现,以便于去如何着手编写自己的Scope实现。

在实现一个或多个自定义Scope并测试通过之后,接下来就是如何让Spring容器识别你的新作用域。ConfigurableBeanFactory接口声明了给Spring容器注册新Scope的主要方法。(大部分随Spring一起发布的BeanFactory具体实现类都实现了该接口);

该接口的主要方法如下所示:

package org.springframework.beans.factory.config;

import org.springframework.beans.factory.ObjectFactory;

public interface Scope
{

    public abstract Object get(String s, ObjectFactory objectfactory);

    public abstract Object remove(String s);

    public abstract void registerDestructionCallback(String s, Runnable runnable);

    public abstract String getConversationId();
}

 1.实现 Scope 接口

package com.myscope;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ObjectFactory;


public class ThreadScope implements org.springframework.beans.factory.config.Scope{
	private final ThreadLocal<Object> threadScope = new ThreadLocal<Object>() {
		protected Object initialValue() {
			return new HashMap<String, Object>();
		}
	};

	public Object get(String s, ObjectFactory objectfactory) throws BeansException{
		Map<String, Object> scope = (Map<String, Object>) threadScope.get();
		Object object = scope.get(s);
		if (object == null) {
			object = objectfactory.getObject();
			scope.put(s, object);
		}
		return object;
	}

	public Object remove(String name) {
		Map<String, Object> scope = (Map<String, Object>) threadScope.get();
		return scope.remove(name);
	}

	public String getConversationId() {
		return null;
	}

	public Object resolveContextualObject(String key) {
		return null;
	}

	public void registerDestructionCallback(String name, Runnable callback) {

	}

}

 2.通过工厂注册

applicationContext.getBeanFactory().registerScope("myScope", scope);      

 

然后你就可以像下面这样创建与自定义Scope的作用域规则相吻合的bean定义了:

<bean id="..." class="..." scope="myScope"/>

完整xml配置:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="thread" value="com.myscope.ThreadScope"/>
            </map>
        </property>
    </bean>

    <bean id="bar" class="com.demo1" scope="thread">
        <property name="name" value="Rick"/>
        <aop:scoped-proxy/>
    </bean>

 或者:

<bean id="myScope" class="com.myscope.ThreadScope"/>   
<bean id="customerScope" class="org.springframework.beans.factory.config.CustomScopeConfigurer">   
    <property name="scopes">   
        <map>   
            <entry key="myScope">   
                <bean class="myScope"/>   
            </entry>   
        </map>   
    </property>   
</bean>   
<bean id="usesScope" class="com.demo" scope="myScope"/>   

 

分享到:
评论

相关推荐

    spring的bean作用域

    除了这些标准作用域,Spring还允许用户自定义作用域,以满足特定的应用场景需求。自定义作用域需要实现ApplicationContextAware接口来获取ApplicationContext,并通过实现Scope接口来定义作用域的行为。 理解并正确...

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

    6. **自定义作用域**:Spring允许开发者定义自己的作用域,通过实现`Scope`接口并注册到ApplicationContext中。这为特殊场景提供了灵活性,比如定时任务或者特定事件触发的Bean。 了解了Bean的作用域后,开发者需要...

    Spring Bean 加载顺序 .

    对于Singleton作用域的Bean,Spring会在容器启动时一次性实例化所有Bean。实例化顺序基于Bean的依赖关系和`@DependsOn`注解。如果Bean之间没有依赖关系,Spring将按照Bean定义的顺序实例化。对于Prototype作用域,...

    spring bean life cycle

    `scope`属性可以设定Bean的作用域,如单例(singleton)或多例(prototype)。 总的来说,Spring Bean生命周期的理解和灵活运用,能帮助我们更好地控制Bean的行为,实现更高效、更可控的依赖管理和资源管理。通过...

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    在Spring框架中,Bean的生命周期管理和作用域是其核心特性之一,它们对于理解Spring如何管理对象的创建、初始化、使用以及销毁至关重要。首先,我们来深入探讨Bean的生命周期。 Spring中的Bean生命周期主要分为两个...

    Spring bean生命周期demo

    在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、作用域等属性。这个阶段不涉及Bean的实际实例化,而是构建Bean的元数据。 2. **Bean实例化** 实例化是...

    Spring Bean生命周期&BeanDefinitions1

    Spring的BeanDefinition是用来存储Bean的配置信息,包括Bean的类名、作用域、属性值、依赖的其他Bean、是否为单例、是否延迟加载等。这些信息在容器启动时解析并转化为BeanDefinition对象,后续的Bean实例化和管理都...

    Spring Bean 的生命周期

    - **作用域的影响**:不同作用域(如singleton、prototype、request、session等)的Bean,其生命周期和创建方式都有所不同,需要根据应用场景选择合适的作用域。 - **懒加载**:如果Bean配置为`lazy-init="true"`,...

    spring的bean加载顺序样例项目

    - Bean的作用域包括单例(`singleton`)、原型(`prototype`)、请求(`request`)、会话(`session`)等。默认情况下,Bean是单例的,即在整个应用中只有一个实例。 2. **Bean的加载过程** - 当Spring容器启动时...

    详解Spring中bean的scope以后使用

    此外,Spring还允许开发者自定义作用域,以满足特定的需求。 #### 三、Singleton作用域 **Singleton**是Spring中最常用的作用域之一。当一个Bean被定义为Singleton时,Spring容器只会为这个Bean创建一个实例,并将...

    Spring中与Bean相关的接口

    Spring还允许我们自定义Bean的作用域。默认情况下,Bean是单例(Singleton),但在`@Scope`注解的帮助下,我们可以创建原型(Prototype)、会话(Session)或请求(Request)作用域的Bean。 最后,`...

    spring中的bean

    6. **作用域**:Spring Bean有多种作用域,如单例(Singleton)、原型(Prototype)、会话(Session)和请求(Request)。单例Bean在整个应用中只有一个实例,而原型Bean每次请求都会创建新的实例。 7. **AOP**:...

    Spring Reference - Core Technologies.pdf

    Spring允许自定义作用域,开发者可以创建自己的作用域以及在自定义作用域中使用Bean。 1.6 自定义Bean的性质 Spring允许自定义Bean的生命周期回调、依赖以及作用域等。 1.6.1 生命周期回调 Spring管理Bean的生命...

    Spring的bean生命周期

    4. **Bean的作用域**:Spring支持单例(Singleton)、原型(Prototype)、请求(Request)、session(Session)等多种作用域。不同作用域会影响Bean的创建和销毁时机。 5. **使用**:在完成初始化之后,Bean可以被...

    day38 16-Spring的Bean的装配:注解的方式

    5. **配置Bean作用域**:使用`@Scope`注解来定义Bean的作用域。默认情况下,Spring Bean是单例的。 ```java @Scope("prototype") @Service public class PrototypeService { // ... } ``` 6. **生命周期方法**:...

    Spring IOC原理补充说明(循环依赖、Bean作用域等)

    本文将深入探讨Spring如何处理循环依赖以及Bean的作用域。 **循环依赖** 循环依赖是指两个或多个Bean之间形成相互依赖的关系,使得在实例化过程中陷入死循环。例如,Bean A依赖于Bean B,同时Bean B也依赖于Bean A...

    Spring官方文档之核心篇

    - **自定义作用域**:允许开发者自定义Bean的作用域。 #### Bean生命周期 Spring中的Bean具备生命周期回调接口,允许在Bean的初始化和销毁阶段执行特定操作。 - **初始化回调**:如InitializingBean接口和自定义...

    Spring在应用中获得Bean的方法

    在`DefaultListableBeanFactory`中,`doGetBean()`方法是获取Bean的核心实现,它会检查Bean是否存在、处理依赖注入、处理作用域等。通过跟踪源码,我们可以更深入地理解Spring的IoC(控制反转)和DI(依赖注入)机制...

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

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

    Spring-Framework-Notes-For-Professionals.pdf

    - Spring支持将原型作用域的Bean注入单例作用域的Bean中。 6. Spring Bean的作用域 - Spring容器中的Bean可以有不同的作用域。 - 默认作用域是单例(singleton),确保容器中只有一个共享实例。 - 除了单例作用...

Global site tag (gtag.js) - Google Analytics