我试图理解 Spring 中的会话 bean。我正在阅读的那本书说,关于他们:
bean 在需要时创建并存储在 javax.servlet.http.HttpSession 中。当会话被销毁时,bean 实例也被销毁。
我尝试了以下示例:
豆子:
package com.at.test.web;
public class Cart {
public static int dummy = 0;
public Cart() {
System.out.println("Cart::<init> with hashCode " + hashCode());
}
}
豆定义:
<beans:bean id="cartBean" class="com.at.test.web.Cart" scope="session">
<apo:scoped-proxy/>
</beans:bean>
控制器:
@Controller
public class HomeController {
@Autowired
private Cart cart;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(HttpSession session, Model model) {
System.out.println("Cart is: " + cart.hashCode()
+ " ; dummy = " + (cart.dummy++)
+ " (" + cart.getClass().getCanonicalName() + ")"
+ "; session is: " + session.hashCode());
return "home.jsp";
}
}
这是 Tomcat 启动时发生的情况:
Cart::<init> with hashCode 970109301
我认为 Spring 需要这个实例来创建 CGLIB 代理。无论如何,我不确定。
启动后,我用两个不同的浏览器有两个不同的HttpSession。调用控制器时的结果是:
Cart is: 578093288 ; dummy = 0 (com.at.test.web.Cart$$EnhancerByCGLIB$$2eb8334f); session is: 1013723725
Cart is: 578093288 ; dummy = 1 (com.at.test.web.Cart$$EnhancerByCGLIB$$2eb8334f); session is: 1060682497
购物车实例似乎在 HttpSession-s 之间共享,但我期待有两个购物车实例。
如果我让 bean 实现一个接口,使用注释驱动的方法和组件扫描,也是一样的:
public interface ICart {}
--
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.INTERFACES)
public class Cart implements ICart {
public static int dummy = 0;
public Cart() {
System.out.println("Cart::<init> with hashCode " + hashCode());
}
}
我错过了什么吗?我误解了会话bean的含义吗?