如何设置 Spring 会话范围 bean 的属性名称?

Posted

技术标签:

【中文标题】如何设置 Spring 会话范围 bean 的属性名称?【英文标题】:How to set the attribute name of a Spring session scoped bean? 【发布时间】:2012-05-21 13:40:08 【问题描述】:

给定一个配置了会话范围的spring bean,例如:

@Component
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,value=WebApplicationContext.SCOPE_SESSION)
public class SomeBean 

有什么方法可以控制 Spring 将 bean 存储在 http 会话中的名称吗?

默认情况下弹簧接缝使用会话密钥scopedTarget.someBean 有什么我可以添加到注释中以显式指定会话中的属性名称吗?

【问题讨论】:

必须重新实现 Spring 提供的 SessionScope。会话范围的 bean 旨在供 Spring 使用,它们并不意味着将内容存储在会话中,并且您可以在页面(或其他任何内容)中获取它们以显示信息。 【参考方案1】:

我会使用:

@Component (value="mySpecialName")
@Scope (value="session")

【讨论】:

不起作用,组件以“mySpecialName”的 id 结束,但在会话中存储 bean 的属性仍然是 scopedTarget.mySpecialName 我真的想控制已安装的会话范围的 http 会话存储在 我已将答案更改为包含@Scope。在我的代码中,我不需要设置 proxyMode。【参考方案2】:

你不能。 scopedTarget 部分在 Spring 的作用域代理创建中被硬编码。因此,如果不重写根本不可能的框架部分。

名称在ScopedProxyBeanDefinitionDecorator 中硬编码,它代表ScopedProxyUtils

您使用范围代理的事实是框架内部的事情。您可能希望使用它在会话中存储某些内容并在页面或类似内容中检索它。不要,只需公开将委托给适当范围实例的常规 bean。

【讨论】:

以上是关于如何设置 Spring 会话范围 bean 的属性名称?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot,Spring Security,会话范围 Bean 的会话超时问题,@PreDestroy

Spring会话范围的bean作为原型bean中的依赖项?

Spring 3 MVC:在 MVC 控制器方法参数中公开会话范围的 bean

带有 AOP 的 Spring 会话范围 bean 中的问题

Spring在AuthenticationSuccessHandler中自动装配会话范围bean不起作用

Spring 安全性和 JSF:在登录时调用支持 bean 的方法?