spring中创建的对象的作用域
1.spring中创建对象的三种方式
- 使用无参数构造器创建
- 使用静态工厂方法创建
- 使用实例化对象工厂方法创建
<!-- 使用无参数构造器 -->
<bean id="person" class="com.boe.Person"></bean>
<!-- 使用静态工厂方法 -->
<bean id="cal" class="java.util.Calendar" factory-method="getInstance">
<!-- 使用实例化对象工厂方法 -->
<bean id="date" factory-bean="cal" factory-method="getTime"></bean>
2.作用域
作用域有singleton和prototype,默认为前者,设置延迟加载只对singleton有效。
- 当scope为singleton时
可以看出作用域为singleton时,对象只创建了一次,并且两者相等,虽然使用getBean方法两次,但是却只有一个对象,似乎对象不是getBean方法获得,这跟后面要说的延迟加载有关。 - 当scope为prototype时
当作用域为prototype时,创建了两个对象,并且两者不相等,说明使用一个getBean方法,就创建了一个新的对象。
延迟加载:默认情况下容器启动之后,会将作用域为singleton的bean创建好,设置延迟加载容器启动之后,对作用域为singleton的bean不再创建,直到调用getBean方法才会创建,设置延迟加载需在配置文件中设置lazy-init属性。
(1)scope="singleton",lazy-init="false":启动容器就创建对象,并且只有一个
(2)scope="singleton",lazy-init="true":启动容器不会创建对象,直到调用getBean方法才会创建对象,并且只有一个
(3)scope="prototype",无论是否设置延迟加载,均只有在调用getBean方法才会创建对象,并且是创建多个不同的对象