SpringBean单例与多例
在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)
单例多例 | 说明 |
---|---|
singleton(单例) | 只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。 |
prototype(多例) | 对这个bean的每次请求都会创建一个新的bean实例,类似于new。 |
Spring bean 默认是单例模式。
那什么时候用单例?什么时候用多例?
当对象含有可改变状态时(在实际应用中该状态会改变),则多例,否则单例。
例如dao和service层的数据一般不会有响应的属性改变,所以考虑单例,而controller层会存储很多需要操作的vo类,此时这个对象的状态就会被改变,则需要使用多例
怎么用
配置单例与多例
配置单例:在bean时,加一个scope = “singleton”;如果不写个默认是true,也就是单例的,写了就是多例的
<bean id="hello" class="com.test.Hi" init-method="init" scope="singleton">
配置多例:
<bean id="hello" class="com.test.Hi" init-method="init" scope="prototype">
spring的bean为什么默认是单例的?
- 为了提高性能。
- 由于不会每次都新创建新对象,所以就减少了新生成实例的消耗。因为spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。
- 减少JVM垃圾回收,由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
- 可以快速获取到bean,因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。
缺点就是在并发环境下可能会出现线程安全问题