Spring学习笔记——Spring中lazy-init与abstract具体解释
2017-07-10 21:39
423 查看
Spring的懒载入的作用是为了避免无谓的性能开销,就是当真正须要数据的时候才去运行数据的载入操作。不只在Spring中。我们在实际的编码过程中也应该借鉴这种思想,来提高我们程序的效率。
首先我们看一段配置文件:
当IOC容器启动时,createService不会被实例化,而lendService会被实例化,可是有以下一种情况
当容器启动时,lendService会被实例化。可是lendService持有对creditService的引用,此时。creditService也会被实例化。正如開始说的那样。懒载入就是当真正须要数据的时候才去运行数据的载入。
讲到这里,我们顺便说说一个lazy-init相似的属性abstract,当某个bean的class被设置为abstract=”true”时。这个class始终不会被实例化。而充当一个模板的作用,以下我们详细分析一个样例:
这个bean非常明显没有配置class属性,当没有配置class属性时,我们必须显式的将abstract标记为true。子bean能够继承父bean属性,也能够覆盖。
一个子bean定义能够从父bean继承构造器參数值、属性值以及覆盖父bean的方法,并且能够有选择地添加新的值。
假设指定了init-method,destroy-method和/或静态factory-method,它们就会覆盖父bean对应的设置。剩余的设置将总是从子bean定义处得到:依赖、自己主动装配模式、依赖检查、singleton、作用域和延迟初始化。
因为这种父bean是不完整的,并且还被显式标记为抽象的,因而它无法得到自己的实例。抽象bean定义可作为子bean定义的模板。若要尝试单独使用这种父bean(比方将它作为其它bean的ref属性而引用。或者直接使用这个父bean的id作为參数调用getBean()方法)。将会导致错误。相同地。容器内部的preInstantiateSingletons()方法会全然忽略abstract的bean定义。
假设你有一个(父)bean定义你希望只作为模版使用,而这个定义说明了一个类,你必须把abstract參数设置为true,否则应用程序上下文将试图预先初始化它
首先我们看一段配置文件:
<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,否则应用程序上下文将试图预先初始化它
相关文章推荐
- Spring学习笔记——Spring中lazy-init与abstract详解
- jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释
- TCP/IP具体解释学习笔记--TCP的坚持和保活定时器
- TCP/IP具体解释学习笔记--TCP的超时与重传
- spring两个重要属性lazy-init和abstract
- spring's lazy-init & abstract
- Cocos2d-x学习笔记(十四)CCAutoreleasePool具体解释
- ITCAST视频-Spring学习笔记(使用CGLIB实现AOP功能与AOP概念解释)
- lua学习笔记13:协程具体解释和举例
- Java学习笔记:具体解释传值和传引用
- TCP/IP具体解释学习笔记--TCP数据流
- spring学习笔记之AbstractController源码解读
- Redis学习笔记4-Redis配置具体解释
- spring两个重要属性lazy-init和abstract
- TCP/IP具体解释学习笔记——数据链路层(2)
- Spring学习笔记2-配置相关(context-param&init-param)
- spring两个重要属性lazy-init和abstract
- linux内核学习初笔记(3)u-boot执行第二阶段typedef int (init_fnc_t) (void)解释
- 【Spring学习14】延迟初始化lazy-init与depends-on
- spring技术内幕笔记:lazy-init属性和预实例化