我们已经定义了一个控制器,需要声明HttpSession对象。我可以自动装配它或作为对象传递给方法。这两个选项有什么区别,哪个更好?
选项1
@Controller
public class UserController {
@Autowired
HttpSession session;
..
..
}
选项2
@Controller
public class UserController {
@RequestMapping(value="/user", method=RequestMethod.GET)
public @ResponseBody User getUser(HttpSession session) {
..
..
}
}
答案 0 :(得分:3)
在Controller中,您应该使用Option2。
会话从http请求开始,结束直到请求停止,但控制器可用,直到应用程序停止。所以你不应该在Controller中自动连接HttpSession。
您可以像这样自动装配http会话的情况之一:
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION)
public class CurrentUserHolder{
@Autowired
private HttpSession session;
public User currentUser() {
return this.get();
}
@Override
public User get() {
return (User)session.getAttribute("currentUser");
}
}
因此,您可以在无法获得会话的服务中获取当前用户:
@Service
public class UserService{
private @Autowired CurrentUserHolder currentUserHolder;
......
}
答案 1 :(得分:0)
如果您的控制器中有多个方法需要HttpSession,则选项1 是首选。否则,您可以选择'选项2'而不是在每个方法中对其进行参数化。