2023.11.8
默认情况下,Spring的IoC容器创建的Bean对象是单例的。下面测试一下:
创建一个bean类:
package spring6.beans;public class SpringBean {
}
配置一下xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="sb" class="spring6.beans.SpringBean" /></beans>
测试:
@Testpublic void testScope(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");SpringBean sb1 = applicationContext.getBean("sb", SpringBean.class);SpringBean sb2 = applicationContext.getBean("sb", SpringBean.class);System.out.println(sb1);System.out.println(sb2);}
运行结果:
发现两个对象的地址相同,证明spring中的IoC容器创建的Bean对象默认是单例的。
想要改成多例的,可以在配置文件中修改:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="sb" class="spring6.beans.SpringBean" scope="prototype"/></beans>
运行结果:
为什么bean默认是单例的?
Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。