bean的作用域
- singleton:bean的作用域的默认配置,在spring容器加载时,就创建单例的bean,每次获取对象时都是获取的同一个bean;
- prototype:spring容器加载时并不会去创建bean,而是在每次获取对象时都创建一个新的bean
- request:每次http请求过来时,创建一个新的bean,同一请求中多次获取bean,得到的是相同的bean,不同请求中获取bean时,得到的bean不同。该作用域仅适用于web的Spring WebApplicationContext环境;
- session:同一个http session会话中共享同一个bean,新的会话将创建新的bean。该作用域仅适用于web的Spring WebApplicationContext环境;
- application:限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。
配置方式
配置文件中通过设置scope属性:
<!--当bean作用域为“singleton”时,在加载xml文件时(加载spring容器时),就创建bean对象-->
<bean id="student1" class="entity.Student" scope="singleton">
<property name="id" value="100"></property>
<property name="name" value="jack"></property>
</bean>
<!--当bean作用域为“prototype”时,在获取bean时才会去创建bean对象-->
<bean id="teacheer1" class="entity.Teacher" scope="prototype">
<property name="t_id" value="101"></property>
<property name="t_name" value="MrLi"></property>
</bean>
使用注解@Scope
@Scope("singleton")
@Scope("prototype")
延迟加载
当bean的作用域设置为“singleton”(或者是使用默认值)时,bean对象会在spring容器加载时完成创建,如果bean对象数量较多时,将会消耗较多的时间,这时我们可以通过设置bean的延迟加载使bean在容器初始化时不自动创建,而是在使用到该bean对象时再去创建。
设置方式:
<!--lazy-init="true":开启延迟加载;lazy-init="false":不开启延迟加载;lazy-init="default":使用默认设置:不开启延迟加载;-->
<bean id="student1" class="entity.Student" scope="singleton" lazy-init="default">
<property name="id" value="100"></property>
<property name="name" value="jack"></property>
</bean>
或使用注解:
@Lazy(value = true)
实际情况中,如果不设置延迟加载则启动时会花费一些时间,但带来两个好处:
- 能够在容器加载时,就及时的发现一些潜在的bean实例化相关的配置问题;
- 启动时创建的Bean会以缓存的方式保存,在运行时直接获取bean,虽然增加容器启动时间,但是加快了运行的效率。