Bean的作用域
- Singleton(单例式):在整个应用中,只创建bean的一个实例。
- Prototype(原型式):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- Session(会话式):在Web应用中,为每个会话创建一个bean实例。(eg:电子商务应用中,一个bean代表一个用户的购物车,只要同一个session一个bean)。
- Request(请求式):在Web应用中,为每个请求创建一个bean实例。
Session和Request注入Singleton中问题
@Component @Scope{ Value=WebApplicationContext.SCOPE_SISSION, proxyMode=ScopeProxyMode.INTERFACES} Public ShoppingCart cart(){ } @Component public class StoreService{ @Autowired public void setShoppingCart(ShoppingCart shoppingCart){ this.shoppingCart=shoppingCart; } } 复制代码
分析
注解方式:通过使用@Scope当中的proxyMode方式进行代理处理,
- 实现了接口的类
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.INTERFACES) 复制代码
- 具体的类可以使用CGLib来为其生成一个代理
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 复制代码
可能出现的exception:Scope ‘session’ is not active for the current thread错误。