是否能够在 Spring 中使用构造函数注入将 RequestScope bean 注入到 Singleton bean 中?
Is it able to inject RequestScope bean into Singleton bean using Constructor Injection in Spring?
据我测试,它正在运行。但我不明白它为什么以及如何工作。(我也不确定在生产中使用它是否安全)
这是我的测试代码
@Service
public class SomeService {
private static final Logger logger = LoggerFactory.getLogger(SomeService.class);
private final RequestContext requestContext; // @RequestScope + @Component Bean
public SomeService(RequestContext requestContext) {
this.requestContext = requestContext;
}
public void checkBean() {
logger.info("Singleton Bean: {}, RequestScope Bean: {}", this, this.requestContext);
String clientId = recommendContext.getClientId();
}
}
场景如下
- 从控制器获取请求
SomeService
被控制器注入
- 每个请求都有自己的
RequestContext
Bean
- 在控制器中,调用
someService.checkBean()
我觉得奇怪的一点是
SomeService
是单例 bean
RequestContext
声明为 final
变量,仅由构造函数 启动
- 但它似乎有效。
运行 代码的结果如下所示
2021-06-14 09:56:26.010 INFO 23075 --- [nio-8888-exec-1] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@56867592
2021-06-14 09:56:30.933 INFO 23075 --- [nio-8888-exec-3] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@73ddb7a4
2021-06-14 09:56:31.687 INFO 23075 --- [nio-8888-exec-4] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@56b4f7c8
2021-06-14 09:56:32.352 INFO 23075 --- [nio-8888-exec-5] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@33469287
如您所见,Service 是 Single 并且 RequestContext bean 对于每个请求都是唯一的。
我需要一些关于里面发生的事情的解释 spring
谢谢
当 bean 是请求范围的时,Spring 创建一个代理。每当调用此代理时,它都会委托给特定于当前请求的 bean 实例。
在您的情况下,注入 SomeService
并存储在 requestContext
final
变量中的 RequestContext
实例是代理。如果您尝试在 Web 请求范围之外调用该服务,它将失败,因为代理将无法找到当前请求。
据我测试,它正在运行。但我不明白它为什么以及如何工作。(我也不确定在生产中使用它是否安全)
这是我的测试代码
@Service
public class SomeService {
private static final Logger logger = LoggerFactory.getLogger(SomeService.class);
private final RequestContext requestContext; // @RequestScope + @Component Bean
public SomeService(RequestContext requestContext) {
this.requestContext = requestContext;
}
public void checkBean() {
logger.info("Singleton Bean: {}, RequestScope Bean: {}", this, this.requestContext);
String clientId = recommendContext.getClientId();
}
}
场景如下
- 从控制器获取请求
SomeService
被控制器注入- 每个请求都有自己的
RequestContext
Bean - 在控制器中,调用
someService.checkBean()
我觉得奇怪的一点是
SomeService
是单例 beanRequestContext
声明为final
变量,仅由构造函数 启动
- 但它似乎有效。
运行 代码的结果如下所示
2021-06-14 09:56:26.010 INFO 23075 --- [nio-8888-exec-1] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@56867592
2021-06-14 09:56:30.933 INFO 23075 --- [nio-8888-exec-3] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@73ddb7a4
2021-06-14 09:56:31.687 INFO 23075 --- [nio-8888-exec-4] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@56b4f7c8
2021-06-14 09:56:32.352 INFO 23075 --- [nio-8888-exec-5] p.service.SomeService : Singleton Bean: pkgs.service.SomeServiceImpl@3c65ee26, RequestScope Bean: pkgs.context.RequestContext@33469287
如您所见,Service 是 Single 并且 RequestContext bean 对于每个请求都是唯一的。 我需要一些关于里面发生的事情的解释 spring
谢谢
当 bean 是请求范围的时,Spring 创建一个代理。每当调用此代理时,它都会委托给特定于当前请求的 bean 实例。
在您的情况下,注入 SomeService
并存储在 requestContext
final
变量中的 RequestContext
实例是代理。如果您尝试在 Web 请求范围之外调用该服务,它将失败,因为代理将无法找到当前请求。