Spring框架学习—Spring的IoC之高级特性
lazy-Init 延迟加载,指的是bean对象的延迟加载
当然,这里在刚启动容器就实例化bean对象
,之后是从缓存中
取出来的bean对象
,懒加载指的是当我们getBean的时候才会获取bean对象
的,有一点需要注意lazy-Init 延迟加载
只适用于单例机制,不适用于多例,而且默认是false
- 当没配置
lazy-Init 延迟加载
机制的时候,表示⽴即加载,表示在spring启动时,⽴刻进⾏实例化。<bean id="testBean" class="cn.lagou.LazyBean" /> //该bean默认的设置为: <bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="false" />
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); AccountDao accountDao = (AccountDao) applicationContext.getBean("testBean"); System.out.println(accountDao);
- 查看
applicationContext
中有个beanFactory
,里面有个单例池singletonObjects
,里面放置了bean
对象testBean
- 当配置
lazy-Init 延迟加载
机制的时候,只有执行getBean
操作的时候才会创建bean对象,
目的
:如果不想让⼀个singleton bean 在 ApplicationContext实现初始化时被提前实例化,那么可以将bean设置为延迟实例化。<bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="true" />
- 如果⼀个设置了⽴即加载的 bean1,引⽤了⼀个延迟加载的 bean2 ,那么 bean1 在容器启动时被实例
化,⽽ bean2 由于被 bean1 引⽤,所以也被实例化,这种情况也符合延时加载的 bean 在第⼀次调⽤
时才被实例化的规则。
也可以在容器层次中通过在 元素上使⽤ “default-lazy-init” 属性来控制延时初始化。如下⾯配置:<beans default-lazy-init="true"> <!-- no beans will be eagerly pre-instantiated... --> </beans>
- 如果⼀个 bean 的 scope 属性为 scope=“pototype” 时,即使设置了 lazy-init=“false”,容器启动时也不会实例化bean,⽽是调⽤ getBean ⽅法实例化的。
- 使用注解
@Lazy
也可以达到延迟加载的效果
应⽤场景
- 开启延迟加载⼀定程度提⾼容器启动和运转性能
- 对于不常使⽤的 Bean 设置延迟加载,这样偶尔使⽤的时候再加载,不必要从⼀开始该 Bean 就占⽤资源