账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Spring 会话作用域的bean注入到单例作用域,设置代理后,代理怎么找到当前会话的bean?
    34
    0

    Spring实战上解释的: Session作用域的bean注入到Singleton作用域,需要设置代理后,比如 ScopedProxyMode .INTERFACE 。通过这样的设置,Singleton用域bean调用Session作用域bean方法时,会被代理转发到当前 Session 的 bean 对象上。

    问题是代理怎么找到当前 Session 的 bean?
    单例bean是全局只有一个对象,全局可能有多个Session。调用会话作用域bean时也没有相应的参数表明当前Session是哪个。那怎么知道要转发到哪个会话bean?


    目前想到的是,在每个会话一个线程的模型下,可以通过当前是哪个线程在调用来确定是哪个Session。
    但是,实际情况很可能不是这样。而且如果每个线程可以处理多个会话的处理模型的话,我想到的这种方法也就不能用了了。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 在Spring中,会话作用域的bean是通过@Scope("session")注解来设置的。这意味着这些bean只能在会话中使用。

      当你在Spring中配置一个会话管理器,例如@EnableSslServerConfiguration,它会自动创建并管理一个会话管理器。在这个会话管理器中,所有的bean都将被放入会话作用域。

      当你使用@Autowired注解来注入bean时,Spring会自动将这些bean放入会话作用域。

      如果你想让代理找到当前会话的bean,你需要在代理类上使用@ApplicationContext注解,并且需要在代理类中注入当前会话管理器。

      以下是一个简单的示例:

      ```java public class SessionProxy implements ApplicationContextAware { private ApplicationContext context;

      @Override
      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
          this.context = applicationContext;
      }
      
      public Object getBean(String name) {
          return context.getBean(name);
      }
      

      } ```

      在这个示例中,SessionProxy是一个实现了ApplicationContextAware接口的类。ApplicationContextAware接口有一个方法setApplicationContext(ApplicationContext applicationContext),这个方法会在代理类中被调用,以获取当前的会话管理器。

      然后,SessionProxygetBean方法会返回当前的会话管理器中定义的bean。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部