快捷搜索: 王者荣耀 脱发

Spring在单例bean中使用session、request范围的bean

在单例的bean中使用session、request范围的bean有很多应用场景,比如说在电子商务系统中需要为每个会话创建一个购物车bean,如果是使用单例模式的购物车bean那么所有用户都会向同一个公务车中添加商品。

在spring初始化的时候创建单例bean时,不会向bean中注入session、request范围bean的实例而是注入他们的代理,当有会话产生时才会实例化这些bean,当调用这些bean的方法时代理会委托给回话内真实的bean。

第一种方式(推荐)

/**
     * 创建一个接口并写出他的实现类,
     * proxyMode设置为ScopedProxyMode.INTERFACES
     */
@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION,
        proxyMode = ScopedProxyMode.INTERFACES)
public class SessionService implements ISessionService{
          
   

    public String get(){
        return this.toString();
    }
}
/**
     *在单例bean中注入接口类型的bean
     */
    @Autowired
    ISessionService sessionService;

    @RequestMapping("/t.do")
    @ResponseBody
    public Object t(){
        return sessionService.get()+" 
 "+this.toString();
    }

第二种方法

/**
 *针对具体的类,这种情况Spring没法创建基于接口的代理了,
 *所以它必须使用CGLib来生成基于类的代理。
 *所以如果bean是具体的类proxyMode必须设置成ScopedProxyMode.TARGET_CLASS
*/ 
@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION,
        proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionService{
          
   

    /**
     *
     * @return
     */
    public String get(){
        return this.toString();
    }
}
/**
 *在单例模式中直接注入就行
 */
@Autowired
    SessionService sessionService;

    @RequestMapping("/t.do")
    @ResponseBody
    public Object t(){
        return sessionService.get()+" 
 "+this.toString();
    }
经验分享 程序员 微信小程序 职场和发展