• Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.5.5 自定义(custom)作用域


    6.5.5 自定义(custom)作用域

    Bean的作用域是可扩展的;您可以定义自己的作用域,甚至重新定义现有作用域,尽管后者被认为是不好的做法,您无法覆盖内置的单例和原型作用域。

    创建自定义作用域

    要将自定义作用域集成到Spring容器中,需要实现org.springframework.beans.factory.config.Scope接口,本节将对此进行介绍。有关如何实现自己的作用域的方法,请参阅Spring框架本身的Scope实现以及javadocs提供的Scope实现,它们阐述了您需要的更详细地实现方法。

    Scope接口有四种方法,可以从作用域中获取对象,从作用域中删除它们,并允许它们被销毁。

    以下方法从相关的作用域返回对象。例如,会话作用域的实现会返回会话作用域的bean(如果它不存在,在将其绑定到会话上以供将来参考之后,该方法会返回该bean的新实例)。

    Object get(String name, ObjectFactory objectFactory)

    以下方法从相关的作用域中删除对象。 例如,会话作用域的实现从相关的会话中删除会话作用域的bean。应被返回的对象,但如果找不到具有指定名称的对象,则可以返回null。

    Object remove(String name)

    以下方法注册了回调函数,在作用域被销毁时或者当作用域中的特定对象被销毁时,该函数会被执行。有关销毁回调的更多信息,请参阅javadocs或Spring作用域实现。

    void registerDestructionCallback(String name, Runnable destructionCallback)

    以下方法获取相关作用域的对话标识符。 对于每个作用域,标识符都不同。对于会话作用域的实现,该标识符可以是会话标识符。

    String getConversationId()

    使用自定义作用域

    在编写并测试一个或多个自定义Scope实现之后,您需要让Spring容器理解您的新作用域。 以下方法是使用Spring容器注册新Scope的核心方法:

    void registerScope(String scopeName, Scope scope);

    此方法在ConfigurableBeanFactory接口上声明,对于通过BeanFactory属性装载到Spring上的该接口的大多数具体ApplicationContext实现是可用的。

    registerScope(..)方法的第一个参数是与作用域相关联的唯一名称; Spring容器本身的这些名称的例子有singleton和prototype。 registerScope(..)方法的第二个参数是您希望注册和使用的自定义Scope实现的实际实例。

    假设您编写了自定义Scope实现,然后按如下所示进行注册。

    注意:下面的示例使用Spring附带的SimpleThreadScope,但默认情况下未注册。对于您自己的自定义Scope实现,这些指令是相同的。

    Scope threadScope = new SimpleThreadScope();
    beanFactory.registerScope("thread", threadScope);

    然后创建符合自定义作用域的作用域规则的bean定义:

    <bean id="..." class="..." scope="thread">

    使用自定义Scope实现,不局限于以编程形式注册作用域。您也可以使用CustomScopeConfigurer类以声明方式执行Scope注册:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
            <property name="scopes">
                <map>
                    <entry key="thread">
                        <bean class="org.springframework.context.support.SimpleThreadScope"/>
                    </entry>
                </map>
            </property>
        </bean>
    
        <bean id="bar" class="x.y.Bar" scope="thread">
            <property name="name" value="Rick"/>
            <aop:scoped-proxy/>
        </bean>
    
        <bean id="foo" class="x.y.Foo">
            <property name="bar" ref="bar"/>
        </bean>
    
    </beans>

    注意:当您在FactoryBean实现中放置<aop:scoped-proxy />时,它是作用域的工厂bean本身,而不是从getObject()返回的对象。

  • 相关阅读:
    利用Python对文件进行批量重命名
    应用程序处于中断模式-设置方法
    idea http请求的插件(测试接口方便)
    ajax 分页(jquery分页插件pagination) 小例3
    JProfile 9.2 linux安装及windows客户端远程监控
    serializeObject 的应用
    linux下 mysql数据库的备份和还原
    ajax 分页(jquery分页插件pagination) 小例2
    bootstrapTable 应用小例(收索)
    表格 td中,取checkbox后几位值
  • 原文地址:https://www.cnblogs.com/springmorning/p/10353471.html
Copyright © 2020-2023  润新知