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 一样吗?
- 我的理解是案例 1 和案例 2 也是如此。我们使用@Scope(Session) 将其应用于完整的类。因此,我可以在控制器级别使用 @Scope(‘Session’) 并使控制器及其属性(可能是 POJO 或原始 java 变量)会话范围。当我们使用 @SessionAttribute(‘model’) 时,它会限制为特定的属性。请分享您的理解。
这两种方法都创建一个会话属性。
当使用 @Scope(‘Session’) spring 确定名称时,bean 不会自动填充任何控制器的模型。它是一个可以自动装配的普通 bean。但是,如果您想要在单例 bean 中自动装配当前值(当前会话中的值),则必须使用范围代理。
当使用 @SessionAttributes(‘employee’) 时,您声明模型属性 employee 将存在于会话中。如果控制器的任何方法需要在提交后初始化属性,spring 将在会话中查找属性的版本。但它不能在另一个 bean 中自动装配。
因此,虽然这两种方法在会话中显然给出了相同的结果:employee,但它们对应于不同的用例。
- 谢谢,我想你是在暗示这个:<!-- 一个暴露为代理的 HTTP 会话范围的 bean --> <bean id="employee" class="com.test.Employee" scope="session"> <! -- 下一个元素影响周围 bean 的代理 --> </bean> Controller public class EmployeeController { Autowired private Employee employee; RequestMapping("/viewEmployeeDetails") public ModelAndView viewEmployeeDetails() { // 现在只使用员工 } }
@SessionAttributes spring 注释声明 session attributes。
这通常会列出模型属性的名称,这些属性应该透明地存储在会话中,作为后续请求之间的表单支持 bean。所以它仅限于会话
While @Scope:指定用于带注释的组件/bean 的范围。它的属性可以是 SINGLETON,PROTOYPE,SESSION,REQUEST。默认范围是 SINGLETON