gpt4 book ai didi

java - Spring代理是否请求属性?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:01 25 4
gpt4 key购买 nike

如果我在某个地方有一个带有 @Autowired HttpSession 或 HttpServletRequest 的单例 @Component bean“Foo”,Foo 本身 必须是声明的 session (或请求)作用域,或者我可以将它保持为一个简单的单例——在这种情况下,HttpSession 和/或 HttpServletRequest 可能已经通过 Spring 注入(inject)为作用域代理?

最佳答案

这是一个非常简单的测试来检查行为(Spring 4.0.0.RELEASE)

@Controller
@RequestMapping("/service")
public class NewController {
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody String test(ModelMap model) {
System.out.println(requestEntity.request.getAttribute("type")); // get it
requestEntity.request.setAttribute("type", "Scope"); // set it so that we can make sure that our second request doesn't contain it
System.out.println(requestEntity.request.getClass());
return "whatever";
}

@Autowired
private Foo requestEntity;
}

@Component
public class Foo {
@Autowired
public HttpServletRequest request;
}

如果您发送请求,您会注意到返回的属性始终是 null并且该类(class)类似于

class com.sun.proxy.$Proxy19

因此你总是得到一个不同的HttpServletRequest对象即使 @Component bean 是单例范围的。


解释如下:

当您实例化 WebApplicationContent 时, 它注册了一些特殊的 ObjectFactory解析底层中某些 web 类型的实例 BeanFactory .这是在 WebApplicationContextUtils.registerWebApplicationScopes(..) 中完成的.其中之一如下

beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());

当 Spring 扫描您的 bean 并确定它需要 Autowiring HttpServletRequest 时(它是 ServletRequest 的子类型)字段,它将在其可解析依赖关系映射中查找并获得此 RequestObjectFactory .

因为这是一个 ObjectFactory并且注入(inject)目标是一个接口(interface)类型,Spring 将创建一个该类型的代理,委托(delegate)给 RequestObjectFactory 创建/返回的对象。在每个请求上。这是在 AutowireUtils.resolveAutowiringValue(..) 中完成的.

因此,您的 Foo bean 不需要在请求范围内。

关于java - Spring代理是否请求属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21370678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com