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

sar*_*hdi 12 spring annotations dependency-injection autowired

在我的应用程序中,我使用自动连接User到我的服务的bean,MyService并将其用作登录用户信息的原则(因此用户不是从xml作为静态bean而是从登录用户动态生成)如果有登录的十个用户我将有十个该@AutoWired User领域的候选人.(对吗?)我可以在Spring容器中找到其中任何一个cos AutoWired,而不是会话.

告诉我,如果我错了.以及如果可能的话如何实际解决它.但是如果我的AutoWired字段被注释了怎么办呢@Scope ("Session")

像这样 :

@Component("user")
@Scope("session")
public class User 
{
String userid;
String name;
//getter setters etc
}
Run Code Online (Sandbox Code Playgroud)
@Component
public class MyService
{
    @Autowired
    private User user;

}
Run Code Online (Sandbox Code Playgroud)

当我调用MyServiceComponent 时,是否可以获取其他用户的User bean .Cos MyService只是@Component即使它User@Scope(session).

基本上,(如果我的假设是错的)我认为当你@Autowire是一个字段时,它会将容器视为整体并且容器不会被分成每个会话的子容器.

ska*_*man 15

当您使用User,@Scope("session")然后将@Autowire其注释到另一个非范围组件时,Spring将生成一个位于MyService和之间的代理User.此代理将从User当前会话中找到该代理,并将任何来自MyService代理的调用委派给会话范围User.

所以它非常安全,MyService组件只能访问User当前会话.

如果代理未发生,则容器将无法启动,因为您无法直接将会话范围的bean注入到单例范围的bean中.


pra*_*ant 14

Spring不会自动创建代理.您需要将范围注释更改为以下内容

@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
Run Code Online (Sandbox Code Playgroud)

这将确保当会话bean在单例类中进行自动装配时,将围绕bean创建一个代理,该代理负责从会话中获取bean.