Spring学习笔记——Spring中lazy-init与abstract详解

Spring的懒加载的作用是为了避免无谓的性能开销,就是当真正需要数据的时候才去执行数据的加载操作。不仅仅在Spring中,我们在实际的编码过程中也应该借鉴这种思想,来提高我们程序的效率。
首先我们看一段配置文件:

<beans>
    <bean>
        <bean id="creditService" type="com.jader.service.CreditServiceImpl" lazy-init="true"/>
        <bean id="lendService" type="com.jader.service.LendServiceImpl" lazy-init="false"/>
    </bean>
</beans>

当IOC容器启动时,createService不会被实例化,而lendService会被实例化,但是有下面一种情况

<beans>
    <bean>
        <bean id="creditService" type="com.jader.service.CreditServiceImpl" lazy-init="true"/>
        <bean id="lendService" type="com.jader.service.LendServiceImpl" lazy-init="false">
            <property name="creditService" ref="creditService"/> 
        </bean>
    </bean>
</beans>

当容器启动时,lendService会被实例化,但是lendService持有对creditService的引用,此时,creditService也会被实例化。正如开始说的那样,懒加载就是当真正需要数据的时候才去执行数据的加载。
说到这里,我们顺便说说一个lazy-init类似的属性abstract,当某个bean的class被设置为abstract=”true”时,这个class始终不会被实例化,而充当一个模板的作用,下面我们具体分析一个例子:

<!-- 配置daoTemplate,作为所有DAO组件的模板 -->
<bean id="daoTemplate" abstract="true">

这个bean很明显没有配置class属性,当没有配置class属性时,我们必须显式的将abstract标记为true,子bean可以继承父bean属性,也可以覆盖。
一个子bean定义可以从父bean继承构造器参数值、属性值以及覆盖父bean的方法,并且可以有选择地增加新的值。如果指定了init-method,destroy-method和/或静态factory-method,它们就会覆盖父bean相应的设置。剩余的设置将总是从子bean定义处得到:依赖、自动装配模式、依赖检查、singleton、作用域和延迟初始化。

<bean id="inheritedTestBeanWithoutClass" abstract="true">
<property name="name" value="parent"/>
<property name="age" value="1"/>
</bean>
<bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
parent="inheritedTestBeanWithoutClass" init-method="initialize">
<property name="name" value="override"/>
<!-- age will inherit the value of 1 from the parent bean definition-->
</bean>

由于这样的父bean是不完整的,而且还被显式标记为抽象的,因而它无法得到自己的实例。抽象bean定义可作为子bean定义的模板。若要尝试单独使用这样的父bean(比如将它作为其他bean的ref属性而引用,或者直接使用这个父bean的id作为参数调用getBean()方法),将会导致错误。同样地,容器内部的preInstantiateSingletons()方法会完全忽略abstract的bean定义。
如果你有一个(父)bean定义你希望仅仅作为模版使用,而这个定义说明了一个类,你必须把abstract参数设置为true,否则应用程序上下文将试图预先初始化它

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值