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,否则应用程序上下文将试图预先初始化它

Spring学习笔记——Spring中lazy-init与abstract具体解释的更多相关文章

  1. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  2. Spring学习笔记--Spring IOC

    沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...

  3. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  4. Spring学习笔记——Spring中的BeanFactory与FactoryBean

    BeanFactory BeanFactory是Spring的org.springframework.beans.factory下的一个接口,是Spring IOC所遵守的基本编程规范.他的实现类有D ...

  5. Spring学习笔记--Spring配置文件和依赖注入

    Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...

  6. Spring学习笔记--Spring简介

    1.spring:给软件行业带来了春天; 2.spring的理念:spring框架的初衷是使的现有的更加实用,spring不是创造轮子(技术或框架),而是使现有的轮子更好的运转;spring本身是一个 ...

  7. Spring学习笔记——Spring依赖注入原理分析

    我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...

  8. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  9. 转:Spring学习笔记---Spring Security登录页

    转:http://axuebin.com/blog/2016/06/21/spring-security/?utm_source=tuicool&utm_medium=referral. 提示 ...

随机推荐

  1. vue的使用配置

    我的编辑器是webstorm,虽然占内容占资源, 但是用起来很方便, 刚开始接触的时候就是用这个软件,很喜欢. vue的教程 1.http://www.jianshu.com/p/5ba253651c ...

  2. luogu P1462 通往奥格瑞玛的道路--spfa+二分答案

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  3. 文本三剑客之awk

    awk和流编辑器sed在工作原理和用法上有很多类似之处,它们都是检查输入数据中的行是否匹配指定的模式,如果匹配成功就对匹配的行执行相应的操作,重复这个过程直到所有的输入数据都被处理完,因此awk和se ...

  4. php 后端规范

    后端框架地址: git@gitee.com:xielisen/xcore.git 框架使用规范,内部沟通 Controller命名规范 1, 首字母大写,其余小写 2, 对应数据库名称. 不要下划线 ...

  5. Java:Md5加密

    文章来源:https://www.cnblogs.com/hello-tl/p/9139334.html import java.security.MessageDigest; public clas ...

  6. 在ubuntu16上搭建rabbitMQ环境

    在ubuntu16上搭建rabbitMQ环境 安装rabbitMQ apt-cache pkgnames | grep rabbitmq apt-get install rabbitmq-server ...

  7. python常用函数 A

    1.any()   iterable元素是不是全为0 2.all()    iterable元素是不是有0 a = [1, 2, 3] b = [1, 0, 3] c = [0, 0, 0] # an ...

  8. Shell脚本问题详解

    例1:找出当前系统中端口大于1024的程序! 使用netstat -tuln查询出的结果如下,需要输出红色字体的行: [root@localhost ~]# netstat -tuln Active ...

  9. js作用域的几个问题

    按照<权威指南>的说法,全局的变量作用域是全局性的,在js代码中,他处处都有定义.而在函数之内声明的变量,就只有在函数体内有定义了.函数的参数也是局部变量,他们只在函数体内部有定义.在函数 ...

  10. 大数据学习——服务器定期上传nginx日志到hdfs

    需求:按照所学知识完成如下: 服务器定期上传nginx日志到hdfs 提示: Hdfs的创建文件夹命令: Hadoop fs -mkdir /文件夹名称 Hdfs的上传命令: Hadoop fs -p ...