# 《Spring核心技术》第57章-会话数据:深度解析@SessionAttributes注解

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-57 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:进一步学习并掌握@SessionAttributes注解的案例和流程,从源码级别彻底掌握@SessionAttributes注解在Spring底层的执行流程。


本章目录如下所示:

  • 学习指引
  • 注解说明
    • 注解源码
    • 使用场景
  • 使用案例
  • 源码时序图
    • 请求方法
    • 重定向请求
    • 访问重定向后的方法
  • 源码解析
    • 请求方法
    • 重定向请求
    • 访问重定向后的方法
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

Spring中的@SessionAttributes注解,你真的彻底了解过吗?

在全面的文章中,介绍了@SessionAttribute注解,@SessionAttribute注解只能标注到方法的参数上,能够通过属性名称即可从当前Session的作用域中获取对应的数据。本章,就简单介绍下@SessionAttributes注解,尽管两个注解相似度比较高,仅仅相差一个字母s,但二者的差异还是蛮大的。

# 二、注解说明

关于@SessionAttributes注解的一点点说明~~

@SessionAttributes注解能够将数据保存到当前Session的作用域中,随后可以使用@SessionAttributes注解从当前作用域中获取数据,也可以使用HttpSession从当前作用域中获取数据。

# 2.1 注解源码

@SessionAttributes注解的源码详见:org.springframework.web.bind.annotation.SessionAttributes。

/**
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @since 2.5
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SessionAttributes {

	@AliasFor("names")
	String[] value() default {};
	/**
	 * @since 4.2
	 */
	@AliasFor("value")
	String[] names() default {};
	Class<?>[] types() default {};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

从源码可以看出,@SessionAttributes注解是从Spring2.5版本开始提供的注解,只能标注到类上,并且在@SessionAttributes注解中提供了如下属性。

  • value:String数组类型的属性,表示要存入Session作用域中的名称。
  • names:String数组类型的属性,作用与value属性相同。
  • types:Class数组类型的属性,表示要存入Session域中的类的Class类型。

# 2.2 使用场景

在基于SpringMVC或者SpringBoot开发应用程序时,如果不想使用Servlet API操作Session数据,就可以使用@SessionAttributes注解实现把数据存入Session作用域。这样,就能够与Servlet API进行解耦,无需一次次手动向Session作用域中保存数据和读取数据。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码