在我的 Spring 应用程序中,以下是场景:
我有一个 Controller A
。另一个使用范围 Request
定义的 bean B
。
@Service("name")
@Scope("request")
class B{
private String name;
public void init(String name){
this.name = name
}
}
还有
@Controller
class A{
@Autowired
@Qualifier("name")
B ob;
//using B
}
- 现在,当我运行应用程序时,出现无法创建新 Bean 的异常。
- 如果我将范围更改为
原型(prototype)
。如果我为每个请求打印 B 的 hashCode,我会得到相同的输出,这意味着它不会为每个请求注入(inject)新对象。 - 上面的 ifsolved 仍然不是线程安全的,因为
ob
引用将指向新的原型(prototype)对象或请求对象,而处理的其他请求将引用新的B
对象。最好是获取对主 Spring MVC 应用程序上下文的引用,然后从方法内部获取 Bean。这样我就可以在本地访问它并获得一个新的实例。但如何解决线程安全问题。
最佳答案
@Controller 位于 Singleton 范围内。使用代理 Bean。
@Service("name")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
class B{
}
关于java - Spring MVC 请求和原型(prototype)范围不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14517115/