在普通Servlet中访问Spring代理会话对象

时间:2013-03-04 12:47:37

标签: spring-mvc spring-aop

我已将表单对象声明为代理作用域并在会话中维护。每当我自动装配表单对象时,代码就完美无缺。如果我想在普通的POJO类中访问war层中的表单对象,那么它就会失败,因为我不是在普通的Java类(非Spring)中自动装配。代码段......

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "session")
class FormA{
}

在Spring控制器中,我能够在SpringController下面检索FormA

@Controller
Class ControllerB{
@Autowired
FormA formA;
}

但我的要求是在普通的Servlet中访问FormA(非Spring类,servlet 2.4实现)。如何在Servlet中检索FormA的实例?

在web.xml中添加了以下侦听器条目,但它返回新的formA但不是会话中的原始formA对象。

<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>

1 个答案:

答案 0 :(得分:2)

如果在Singleton或原型范围的bean中注入了请求,会话和全局会话范围的bean,Spring会将生成的代理注入为依赖项。

当填充代理目标对象时,如果是请求范围,它将存储为threadlocal对象,对于会话范围,它将存储在session中。当在代理上进行调用时,它将委托调用threadlocal / session作用域目标对象。

在您的情况下,如果已填充FormA对象并且已将代理注入控制器,那么您应该能够在该请求中使用此代理来访问FormA对象,前提是它在单线程/会话中。