【问题标题】:Spring @Autowired confusion (container or session)Spring @Autowired 混淆(容器或会话)
【发布时间】:2012-02-10 18:37:11
【问题描述】:

在我的应用程序中,我使用了一个 User bean,它自动连接到我的服务 MyService,并将其用作登录用户信息的原则(因此用户不是来自 xml 的静态 bean,而是动态生成的来自登录用户)如果有十个用户登录,我将有十个候选人用于 @AutoWired User 字段。 (对吗?)我可以在 Spring 容器中获得其中任何一个,因为 AutoWired 看起来是在 Spring 容器中而不是会话中。

如果我错了,请告诉我。以及如果可能的话如何实际解决它。但是,如果我的 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 一个字段时,它会整体查看容器,并且每个会话不会将容器划分为子容器。

【问题讨论】:

    标签: spring dependency-injection annotations autowired


    【解决方案1】:

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

    所以这是非常安全的,MyService 组件只能从当前会话中访问User

    如果代理没有发生,那么容器将无法启动,因为您不能直接将会话范围的 bean 注入单例范围的 bean。

    【讨论】:

    • 所以当我执行一个`SpringUtils.getContext(req).getBean("myservice")`时不可能得到一些不在当前会话中的其他用户bean。跨度>
    • @sarmahdi:没错。当前用户的会话是由 Spring 维护的线程局部变量。
    • 所以当我做一个`SpringUtils.getContext(req).getBean("myservice")`时,我不可能得到一些不在当前会话中的其他用户bean。实际上,我遇到了这个问题,即我加载了一个页面并获得了一些其他用户的详细信息。所以我在想,即使用户是会话范围内的服务,它也可能是 cos,默认情况下,服务不是范围内的。
    • @sarmahdi:不,这不是原因——还有其他事情发生。
    • 谢谢。因此,当您实际执行 @Scope(Session) 时,它会与作为线程局部变量的会话绑定...
    【解决方案2】:

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

    @Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
    

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

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2019-09-13
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2013-09-09
      • 2015-02-16
      相关资源
      最近更新 更多