Spring学习笔记——Spring中lazy-init与abstract详解
2015-07-08 10:27
477 查看
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 MVC 3学习笔记+教程(二)在controller和视图之间传递参数
- windows7+eclipse+hadoop2.3开发环境搭建
- 快速排序法-java实现讲解
- JavaWeb学习笔记--filter开发
- java使用默认线程池踩过的坑(一)
- java中编码问题的处理方案
- 一位大牛的JAVA学习资料
- Spring MVC 3学习笔记+教程(一)开发环境搭建和HelloWorld程序
- MyEclipse将文件中的大写转成小写 或 小写转成大写 方法
- Java内存与垃圾回收调优
- Lombok 安装、入门 - 消除冗长的 java 代码
- 整合Struts2与Spring的步骤
- Java学习笔记
- 第一篇:SSH(Struts+Spring+Hibernate)架构
- 分页自定义标签
- Ubuntu下搭建Java开发环境
- Java开发中的23种设计模式详解
- LeetCode94 BinaryTreeInorderTraversal Java题解(递归 迭代)
- java中List集合及其遍历详解
- 安装Android SDK时,点击SDK Manager.exe闪退,并且jdk的环境变量是对的。(转载)