我有两个网络应用程序。第一个是运行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>
现在的任务是如何将这两个应用程序重构为一个。问题是如何解决这个范围问题。我不能添加假范围,没有它任务不起作用。任何的想法 ?
答案 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
范围,但您可能需要以不同的名称注册它。