首先,spring的bean不一定是单例的,作用于有singleton、prototype、request好多种;
线程安全不一定是使用ThreadLocal,ThreadLocal只是一种方式;
无状态的bean,这个无状态,可以和http的无状态类比一下;有状态的话,就是有上下文(context)
前面说的那些我知道,我最想知道是后面那个问题
多个用户同时登陆,查询数据,从数据库返回的是同一个类,那么默认单例的话,岂不是会出现错误,但是这一定没有错误,因为事实确实都是能登上,这是如何实现这种隔离的呢?至于上下文是指IOC容器中的高级容器吗?有状态无状态确实不太懂,我会下去查查看。
@dark_Souls: 每一次请求对应一个线程,每个线程中的数据有自己的作用域,像你说的那种数据库操作,都是在一个方法中的操作,不是共享的,为什么会有安全问题?
bean是单例,并发访问并没有“修改bean属性”得操作,都是操作得局部变量。这个是线程安全的。至于你说得,“ 多个用户同时发送一个查询或者修改的数据(如账号数据,是一个类) ”. 这种数据一致性,需要通过各种锁。数据库得悲观锁,或者CAS锁来完成。
别的论坛搞到得答案
@寻觅beyond: 这下搞清了,谢谢你蛤
最后问个问题,方法得局部变量,例如controll方法中得变量,是从IOC容器中取吗?还是说用的栈区?
@dark_Souls: 方法中的局部变量,一般都是在方法栈区中,如果局部变量的数据比较大,比如一个字符串有几百兆,就可能存放到堆中。
@寻觅beyond: 明白了,明白了,以前一直以为spring中承包了,程序中所有的对象创建,取用,现在一想,自动装配一般用在service这些类中对象,我以为方法中依赖注入的对象也是从ioc容器中取得。没办法自己悟性差了。谢谢您了。