如何在用户定义的类中定义自定义请求范围

时间:2014-07-09 20:30:57

标签: java spring scope

我有两个网络应用程序。第一个是运行Web服务,我在请求范围内有一些上下文:

<bean class="cz.isvs.ais3.context.request.RequestContextImpl" scope="request">
    <aop:scoped-proxy proxy-target-class="true"/>
</bean>

在第二个应用程序中,每分钟运行一些任务,请求范围被伪造的替换为使用相同的上下文:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="request">
                <bean class="org.springframework.context.support.SimpleThreadScope" />
            </entry>
        </map>
    </property>
</bean>

现在的任务是如何将这两个应用程序重构为一个。问题是如何解决这个范围问题。我不能添加假范围,没有它任务不起作用。任何的想法 ?

1 个答案:

答案 0 :(得分:1)

您可以实现一个复合范围,如果请求存在,则委托其工作RequestScope,否则委托给SimpleThreadScope

public class CompositeRequestScope implements Scope {
    private final Scope requestScope = new RequestScope();
    private final Scope fallbackScope = new SimpleThreadScope();

    public Object get(String name, ObjectFactory<?> objectFactory) {
        return activeScope().get(name, objectFactory);
    }

    ...

    private Scope activeScope() {
        if (RequestContextHolder.getRequestAttributes() != null) {
            return requestScope;    
        } else {
            return fallbackScope;
        }
    }
}

并使用CustomScopeConfigurer注册。

虽然我不确定如何替换内置request范围,但您可能需要以不同的名称注册它。