Spring:了解 @SessionAttributes 与 @Scope(\\’session\\’) 之间的区别

Spring: Understanding on difference between @SessionAttributes vs @Scope('session')

案例 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Scope(‘Session’)
public class Employee{
  //..
}

@Controller
public class EmployeeController {

  @Autowired
  private Employee employee;
    //..
  }
}

情况 2:

1
2
3
4
5
6
7
8
9
@Controller
@SessionAttributes("employee")
public class EmployeeController {

  @ModelAttribute
  public void addEmployee(){
      //..
  }
}

Case1 和Case 2 一样吗?


这两种方法都创建一个会话属性。

当使用 @Scope(‘Session’) spring 确定名称时,bean 不会自动填充任何控制器的模型。它是一个可以自动装配的普通 bean。但是,如果您想要在单例 bean 中自动装配当前值(当前会话中的值),则必须使用范围代理。

当使用 @SessionAttributes(‘employee’) 时,您声明模型属性 employee 将存在于会话中。如果控制器的任何方法需要在提交后初始化属性,spring 将在会话中查找属性的版本。但它不能在另一个 bean 中自动装配。

因此,虽然这两种方法在会话中显然给出了相同的结果:employee,但它们对应于不同的用例。


@SessionAttributes spring 注释声明 session attributes

这通常会列出模型属性的名称,这些属性应该透明地存储在会话中,作为后续请求之间的表单支持 bean。所以它仅限于会话

While @Scope:指定用于带注释的组件/bean 的范围。它的属性可以是 SINGLETON,PROTOYPE,SESSION,REQUEST。默认范围是 SINGLETON