Spring中的单例bean是线程安全的吗?
不是线程安全的。单例bean虽然交由Spring容器进行管理,对于不同用户,不同请求,分配不同线程时,操作的bean对象是同一个。但是,如果bean对象中有可以修改的变量,比如String name,int age这种可以修改的变量,多线程并发的情况下,SPring是无法保证线程安全的。很简单,你都没有保证线程同步,你保证了什么安全。
最简单的例子就是:抢票!抢票的前提是你还有票卖才行呀,同一张票你不保证线程同步,你直接框框一顿卖,一张票卖给四个人,这是诈骗,得进局子。
通常,我们在项目中使用的Spring bean都是不可变的,不可修改的,比如Service,Dao等,这种情况下我们认为它是线程安全的,但是也仅仅是在这种情况下。
如果涉及上述的可修改,自己保证线程安全,可以考虑将单例bean修改为多例,@Scope("prototype")
什么是AOP,你用过吗?Spring中的事务是怎么实现的?
AOP?小意思。面向切面编程。当然用过,记录操作日志,缓存,SPring实现的事务等。比如记录操作日志,使用的是AOP中的环绕通知和切点表达式。
Spring中的事务本质上是通过AOP来实现的,对方法前后进行拦截,在执行方法之前开启事务,在执行完方法之后根据执行情况来提交或者回滚事务。
说