在我的应用程序中,我正在使用一个User
bean自动连接到我的服务MyService
,并将其用作登录用户信息的原则(因此用户不是来自一个静态bean) xml但是从登录用户动态生成)如果有10个用户登录,我将有10个@AutoWired
User
字段的候选者。 (对吗?)我可以在Spring容器中找到其中任何一个cos AutoWired外观,而不是会话。
告诉我这是否错了。以及如果可能的话如何实际解决它。但是,如果我的自动连线字段使用@Scope ("Session")
像这样:
@Component("user")
@Scope("session")
public class User
{
String userid;
String name;
//getter setters etc
}
@Component
public class MyService
{
@Autowired
private User user;
}
当我调用MyService
组件时,是否可以获取其他用户的用户bean。即使MyService
为@Component
,结算User
也只有@Scope(session)
。
基本上,(如果我的假设是错的)我认为当你@Autowire
一个字段时,它会整个容器进入容器,并且容器不会被分成每个会话的子容器。
答案 0 :(得分:13)
当您使用User
注释@Scope("session")
然后将@Autowire
注释到另一个非范围组件时,Spring将生成一个位于MyService
和{{1}之间的代理}。此代理将从当前会话中找到User
,并将从User
到代理的任何调用委派给会话范围的MyService
。
所以它非常安全,User
组件只能访问当前会话中的MyService
。
如果代理未发生,则容器将无法启动,因为您无法直接将会话范围的bean注入到单例范围的bean中。
答案 1 :(得分:13)
Spring不会自动创建代理。您需要将范围注释更改为以下
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
这将确保当会话bean在单例类中自动装配时,将围绕bean创建一个代理,该代理负责从会话中获取bean。