有状态bean和无状态bean
有状态对象
就是有实例变量的对象,可以保存数据,是非现场安全的。每个用户都有自己特有的实例,在用户的生命周期中,bean保存了用户的信息,即为“偶状态”;一旦用户衰亡(调用结束),bean的生命周期也随之结束。即每个用户最初都会得到一个初始的bean。
无状态对象
就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
而在spring中可以使用 @Scope 来控制作用范围通常使用的是
- @Scope(“singleton”) 也就是默认值 单例模式(分为无状态bean 和有状态bean,通常我们不会增加变量,只是专注于方法本身不会有数据共享的情况,只是单纯的查操作)
- @Scope(“prototype”) 多例模式
Spring 单例模式如何解决保存用户信息并且保证线程安全。
使用单例模式下,如果存储用户信息会存在线程安全问题。那么就使用ThreadLocal对象来解决,将用户信息存储在当前线程分配的ThreadLocal,然后调用结束后在清除当前ThreadLocal的信息记录。这样就可以在单例无状态的Bean下实现存储数据了。
单例有状态的bean当然会有线程安全问题。
如有错误欢迎指正