Spring @Autowired混乱(容器或会话)

时间:2012-01-15 12:15:04

标签: spring dependency-injection annotations autowired

在我的应用程序中,我正在使用一个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一个字段时,它会整个容器进入容器,并且容器不会被分成每个会话的子容器。

2 个答案:

答案 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。