Java Spring请求作用域Bean存在于后续请求中
我有一个控制器作用域:会话、一个自动连线服务作用域:会话和一个由服务作用域:请求使用的组件a 每个请求的流应如下所示:Java Spring请求作用域Bean存在于后续请求中,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我有一个控制器作用域:会话、一个自动连线服务作用域:会话和一个由服务作用域:请求使用的组件a 每个请求的流应如下所示: 1) Request Arrives at Controller 2) Controller has an injected service whose method is called 3) Service has an injected component A, and the method of that is called has a custom PreAut
1) Request Arrives at Controller
2) Controller has an injected service whose method is called
3) Service has an injected component A, and the method of that is called has
a custom PreAuthorize expression evaluating a boolean returned by the
method of the injected component A.
4) In successful PreAuthorize (doesn't throw access denied and it goes ahead)
I populate a member variable of bean A.
5) The service method is executed which uses bean A's set member variables'
value.
每次发出请求时,我都会得到相同的成员变量值。基本上,这是第一次请求时的值。每次预授权时我都会更改它。。如果我调试并看到发生了什么,它确实会改变,但是当我在组件自动连接的服务中访问bean时,我会得到旧的值
因此,我为bean A打印了object.toString,该bean是服务中的请求范围。我应该在每个新请求上获得不同的值。但我总是得到相同的值
我做错了什么?对于请求范围内的组件,这是标准/正确的行为吗
以下场景非常有效,因为我在会话范围内的同一对象中获得了更新的值,所以我得到了更改的值:
控制器作用域:会话,服务作用域:会话,组件作用域:会话
编辑
类似地,如果所有3个都是作用域请求,我会为bean获得不同的toString值
编辑2
仔细考虑一下,返回的组件bean是否与会话作用域服务/控制器的成员相同?我尝试了控制器会话、服务请求和组件请求,在自动连线组件的会话中得到了相同的object.toString。预授权访问正确的bean,因为它不访问自动连接到服务的bean的实例
那么我说的对吗,将请求范围内的bean自动连接到会话范围内的控制器(较大范围内的较小范围)是不正确的?我认为这是因为Spring使用单例。发布控制器代码。Spring指南中肯定有一章专门介绍单例内的范围内bean这个主题-我将尝试找到一个链接。简而言之,您应该只对基于接口的依赖项执行此操作,因为它们将被代理。对于标准类,您需要一些继承CGLIB魔法。@ChinmayShah-Spring检测到它正在单例bean中注入作用域bean的情况。它不是注入bean本身,而是注入一个特殊的JDK代理。这个代理是一个动态创建的接口实现,在每次方法调用时,它都要求bean工厂提供作用域bean实例。因此,是的,注入只发生一次,但在每个方法调用中动态获取作用域bean。这种连接机制允许将短期作用域注入到其他bean中。