controller 和service的单例和多例在很多时候其实都有并发问题的影响,但是绝大多数情况,很多人没有在意,只有踩坑了才发现。
按照我以前的测试,可以发现,controller层如果不输入@Scope("prototype"),那么默认是单例的,但是controller 里的@Autowired呢?又晕了,干脆自己做了个简单的测试。
controller 层 不加 @Scope("prototype"),红字输出
Service 不加 @Scope("prototype"),红字输出
启动项目,刷新五次
结果可知。 controller 和 service 层 不加@Scope("prototype"),全部默认为单例!也就是说@Autowired也是单例形式。
对controller 和 service 层,都加@Scope("prototype")
可知,加@Scope("prototype")后,都变为了多例模式。
我还测试了,controller 加@Scope("prototype"),service 不加@Scope("prototype")
从该结果,也可证明 @Autowired是从容器中单例取出来了对象。只是我们平时使用过程中,一般没有用成员变量累加,或者说一般都是只用了mapper 和 方法内的局部变量是没有问题的,但是在有成员变量的变动情况下,这是很危险的。
那么getBean 和refrence是什么结果呢,也可以一起测一下。
将@Autowired改成@Resource其余的不变(service 层不改,现在是controller 加@Scope("prototype"),service 不加@Scope("prototype"))
结果为:
结果可知:@Resource也是默认单例的获取bean
那么getBean呢?
结果可知:@getBean也是默认单例的获取bean(getBean有很多方法,我只是测试了根据名字,这一块我后面会做更详细的测试)