Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring请求作用域Bean存在于后续请求中_Java_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Java Spring请求作用域Bean存在于后续请求中

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

我有一个控制器作用域:会话、一个自动连线服务作用域:会话和一个由服务作用域:请求使用的组件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 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中。