Scope作用域以及涉及的问题

1,816 阅读1分钟

Bean的作用域

  1. Singleton(单例式):在整个应用中,只创建bean的一个实例。
  2. Prototype(原型式):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
  3. Session(会话式):在Web应用中,为每个会话创建一个bean实例。(eg:电子商务应用中,一个bean代表一个用户的购物车,只要同一个session一个bean)。
  4. 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错误