`
demojava
  • 浏览: 540869 次
  • 性别: 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-Reference_zh_CN(Spring中文参考手册)

    3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.1.1. 初始化回调 3.5.1.2. 析构回调 3.5.2. 了解自己 3.5.2.1. BeanFactoryAware 3.5.2.2. BeanNameAware 3.6. bean定义的继承 3.7. 容器扩展点 ...

    Spring中文帮助文档

    3.4.5. 自定义作用域 3.5. 定制bean特性 3.5.1. 生命周期回调 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 ...

    Spring 2.0 开发参考手册

    3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据...

    Spring API

    3.4.5. 自定义作用域 3.5. 定制bean特性 3.5.1. 生命周期回调 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 ...

    spring chm文档

    3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.2. 了解自己 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.2. 用BeanFactoryPostProcessor定制配置元数据...

    Spring.3.x企业应用开发实战(完整版).part2

    4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命...

    Spring攻略(第二版 中文高清版).part1

    2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 2.7.1 问题 72 2.7.2 解决方案 72 2.7.3 工作原理 72 2.8 用Java Config简化XML配置 ...

    Spring攻略(第二版 中文高清版).part2

    2.6 设置Bean作用域 69 2.6.1 问题 69 2.6.2 解决方案 69 2.6.3 工作原理 70 2.7 自定义Bean初始化和析构 72 2.7.1 问题 72 2.7.2 解决方案 72 2.7.3 工作原理 72 2.8 用Java Config简化XML配置 ...

    Spring3.x企业应用开发实战(完整版) part1

    4.8.3 Web应用环境相关的Bean作用域 4.8.4 作用域依赖问题 4.9 FactoryBean 4.10 基于注解的配置 4.10.1 使用注解定义Bean 4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命...

    spring security 参考手册中文版

    29.4.5 Spring Bean配置 226 29.4.6 LDAP属性和定制的UserDetails 227 29.5 Active Directory认证 228 29.5.1 ActiveDirectoryLdapAuthenticationProvider 228 活动目录错误代码 229 30. JSP标签库 230 30.1声明...

    Spring

    全文大纲1、Spring1.1、简介1.2、优点1.3、组成(七大模块)1.4、拓展2、...Spring配置5.1、别名5.2、Bean配置5.3、import6、依赖注入6.1、构造器注入6.2、set方式注入6.3、其他方式注入6.4、Bean的作用域7、Bean的自动...

    springboot参考指南

    测试作用域依赖 ii. 35.2. 测试Spring应用 iii. 35.3. 测试Spring Boot应用 i. 35.3.1. 使用Spock测试Spring Boot应用 iv. 35.4. 测试工具 i. 35.4.1. ConfigFileApplicationContextInitializer ii. 35.4.2. ...

    Grails 中文参考手册

    6.1.2 控制器和作用域 6.1.3 模型和视图 6.1.4 重定向和链 6.1.5 控制器拦截器 6.1.6 数据绑定 6.1.7 XML和JSON响应 6.1.8 上传文件 6.1.9 命令对象 6.2 Groovy Server Pages 6.2.1 GSP基础 6.2.1.1 变量和作用域 ...

    低清版 大型门户网站是这样炼成的.pdf

    6.2.4 bean的作用域与生命周期 374 6.2.5 基于xml方式的bean装配 376 6.2.6 基于annotation方式的bean装配 381 6.2.7 基于xml方式的aop实现 386 6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理...

    Java常见面试题208道.docx

    96.spring 支持几种 bean 的作用域? 97.spring 自动装配 bean 有哪些方式? 98.spring 事务实现方式有哪些? 99.说一下 spring 的事务隔离? 100.说一下 spring mvc 运行流程? 101.spring mvc 有哪些组件? 102.@...

    Grails权威指南

     7.3.3 理解flash作用域  7.4 创建模型(model)  7.5 数据绑定和类型转换  7.5.1 用领域模型(domaincmodel)进行数据绑定  7.5.2 使用binddata方法进行数据绑定  7.6 用重定向控制流程  ...

    jboss as 7 support jsf2.2.1 modules

    Bean在进入该作用域时自动激活,而退出时自动失效。 @FlowDefinition是一个类级别的注释,它允许通过FlowBuilder API定义流。 最后,引入了新的EL对象#{flowScope},用于流的本地存储。该对象对应 facesContext....

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.2.2 Message Driven Bean的概念和 作用 303 8.2.3 实体和JPA 303 8.3 开发无状态的Session Bean 304 8.3.1 开发远程调用的无状态 Session Bean 304 8.3.2 开发本地调用的无状态 Session Bean 311 8.4 发布Session ...

    从J2SE到J2EE知识点介绍

    3. 设置Bean作用域 265 4. 为Bean配置集合(List,Set,Map) 266 5. 调用构造方法创建Bean 271 6. 指定Bean引用与自动装配 276 (二) AOP 278 1. AOP简介 278 (三) Spring 3.X 新特性(JavaConfig,SpEL)简介 285 1. ...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

Global site tag (gtag.js) - Google Analytics