在 Spring.Net 中对象初始化的方式分为两种:

  ① 急切实例化,也就是说 Spring.Net 容器初始化的时候将对象先实例化出来。

  ② 延迟实例化,也就是说我们在调用 GetObject 方法时才实例化该对象。

  Spring.Net 默认使用的 急切实例化 ( lazy-init=“false” ) 的方式来初始化对象。lazy-init=“false” 从字面上理解就是 ”不延迟实例化(急切实例化)“,而 lazy-init=“true” 就是 “延迟实例化”的意思。 只要是一个对象(通过Spring容器创建的) 没有被显示的设置为 lazy-init="true" ,那么 Spring.Net 容器在 被初始化的时候就将 这个对象实例化出来 。

  在设置 lazy-init 的时候,犹如一把双刃剑,设置为 延迟实例化 lazy-init=“true” 的时候我们的应用程序在启动的时候会快一点,但是在启动的时候就不能帮我们检测程序错误了。当在调用的时候遇到错误,后果是不堪设想的。例如: 程序引用了一个不存在的对象定义或发生循环依赖等等。设置为延迟实例化时,则会推迟到对象实际被创建时才会执行。也就是说,如果某个对象或其依赖项无法正确创建,那么即便是容器可以正常创建,在请求这个对象时也会抛出异常。如果遗漏了本该赋值的属性,或者所赋予的属性值无效时,会抛出异常而导致该对象无法正确创建。这也是 IApplicationContext 使用 急切实例化 ( lazy-init=“false” ) 和 单例模式 ( singleton="ture" ) 作为默认布署方式的原因。所有对象都在实际需要前被创建,这种时间和空间上的开销可以保证 IApplicationContext 在创建时及早发现问题。如果愿意,可随时覆盖这一默认行为,将任意对象设置为延迟创建。

一 . 急切实例化

  来看一下默认设置:急切实例化。

  Objects.xml 的配置文件:

 1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3
4 <!--对象默认 设置为急切实例化 lazy-init="false" ,我们在这里显示设置-->
5 <object id="hexu" type="CnblogLesson_4_4.Model.Person,CnblogLesson_4_4" lazy-init="false">
6 <property name="Id" value="1"/>
7 <property name="Name" value="hexu"/>
8 <property name="IsStudent" value="false"/>
9 </object>
10
11 </objects>

  为了更好的证明,Spring.Net 中 lazy-init 的效果,我们为Person.cs 添加构造函数,我们在构造函数中打印一句话: "Person对象被初始化了"。

  Person.cs 代码:

 1 using System;
2 using System.Collections.Generic;
3
4 namespace CnblogLesson_4_4.Model
5 {
6 /// <summary>
7 /// 人类
8 /// </summary>
9 public class Person
10 {
11 public Person() {
12 Console.WriteLine("Person对象被初始化了");
13 }
14
15 /// <summary>
16 /// 编号
17 /// </summary>
18 public int Id { get; set; }
19
20 /// <summary>
21 /// 人的名称
22 /// </summary>
23 public string Name { get; set; }
24
25 /// <summary>
26 /// 是否是学生
27 /// </summary>
28 public bool IsStudent { get; set; }
29 }
30 }

  我们运行程序,可以看到,断点还在  Console.WriteLine("刚刚执行到这里!");  这里的时候, 控制台 就打印出了 “Person对象被初始化了” 。因此可以看出,Spring.Net 对象的默认初始化行为(急切实例化),在初始化容器的时候就将 Person 对象初始化了,而并未真正等到 Person hexu1 = context.GetObject("hexu") as Person; 的调用才进行实例化。

二 . 延迟实例化

  再来看一下 我们手动对对象设置 延迟实例化 ( lazy-init="true" ) 之后是什么效果。

  Objects.xml 的配置文件:

 1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3
4 <!--我们手动对 对象 设置 延迟实例化 lazy-init="true" -->
5 <object id="hexu_lazyinit" type="CnblogLesson_4_4.Model.Person,CnblogLesson_4_4" lazy-init="true">
6 <property name="Id" value="2"/>
7 <property name="Name" value="hexu"/>
8 <property name="IsStudent" value="false"/>
9 </object>
10
11 </objects>

  我们运行程序,可以看到,“刚刚执行到这里!” 这句话被输出之前,调用了 hexu 对象 的构造函数,而 hexu_lazyinit 对象 是在 Console.WriteLine("刚刚执行到这里!"); ,执行之后才被初始化的。

第四章 Spring.Net 如何管理您的类___对象的初始化方式的更多相关文章

  1. 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文

    在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...

  2. 第四章 Spring.Net 如何管理您的类___对象的生命周期链

    各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...

  3. 第四章 Spring.Net 如何管理您的类___对象的手动装配

    前面我们知道了什么是对象,什么是对象工厂,什么是应用程序上下文.这一次我们来看一下对象的装配. Spring.Net 中有多种装配对象的方式,装配这个词可能比较学术化,我们可以理解为对象的创建. Sp ...

  4. 第四章 Spring.Net 如何管理您的类___对象的作用域

    Spring.Net 中对象的作用域,就是描述对象的部署模式 ,Spring.Net 中对象可以通过两种模式布署: ① singleton(单例模式) ② 非singleton 也叫非单例模式(或者叫 ...

  5. 第四章 Spring.Net 如何管理您的类___对象的自动装配

    由于这几天都比较忙,所以对笔记暂时没有更新. Spring.NET具有自动装配的能力,也就是说,Spring.NET可以通过对象的定义自动分辨某个对象的协作对象.自动装配是针对单个对象(按:针对每个协 ...

  6. 第四章 Spring.Net 如何管理您的类___统一资源访问接口

    在前面章节有童鞋提到过 关于配置文件 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容,接下来就详细介绍一下 IResource 接口. IResource 接口 ...

  7. 第四章 Spring.Net 如何管理您的类___让对象了解自己的容器

    我们在开发中,经常需要让对象了解自己所在的容器的信息,例如,有时我们需要让对象知道,对象所在容器的引用是什么,或者是对象在容器中的名称是什么 .Spring.Net 中提供了两个接口,我们使用这两个接 ...

  8. 第四章 Spring.Net 如何管理您的类___自定义对象行为

    Spring.Net 一直讲求 ” 配置应用程序“,有一种需求在实际开发中不太常用,却非常有用 -> 配置对象的行为,Spring.Net 也能够完美的实现.Spring.Net 通过几个专门的 ...

  9. 第四章 Spring.Net 如何管理您的类___IObjectPostProcessor接口

    官方取名叫 对象后处理器 (object post-processor) , 听起来很高级的样子啊!实际上就是所有实现了这个接口的类,增加了两个方法. Spring.Objects.Factory.C ...

随机推荐

  1. UTF8字符串在lua的截取和字数统计【转载】

    转载自:GitHub:pangliang/pangliang.github.com 需求 按字面个数来截取 函数(字符串, 开始位置, 截取长度) utf8sub(,) = 好1世界哈 utf8sub ...

  2. 终端模拟工具:Xshell 4

    终端模拟工具:Xshell 4 2016-09-20 目录 1 安装 2 配置 3 命令 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Window ...

  3. jquery ajax中success与complete的执行顺序 (转)

    http://blog.sina.com.cn/s/blog_4adc4b090101dhnh.html https://q.cnblogs.com/q/21810/ **************** ...

  4. mysql root 密码忘记

    首次安装mysql后,使用root登录mysql.终端会提示需要输入密码.可是安装的过程并没有提示输入root的密码.怎么办呢?通过修改my.conf配置绕开mysql的授权验证,重置root用户的密 ...

  5. sql增删改查封装

    App.config文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> ...

  6. iOS文件和目录操作,iOS文件操作,NSFileManager使用文件操作:

    NSFileManager常用的文件方法: -(NSData*)contentsAtPath:path 从一个文件中读取数据 -(BOLL)createFileAtPath:path contents ...

  7. Mybatis generator 自动生成代码

    开发项目的时候,表很多,是不可能一点点的自己去写xml ,dao文件的,这里就需要用到代码的自动生成工具了. 第一步:导入jar包,当然,这之前,基本环境,像mybatis,数据库之类的都得搭建好. ...

  8. C语言 · 字符串对比

    问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...

  9. u-boot 2011.09 使用自己的board 以及config.h

    一个新的方案,用的UBOOT 可能和上一个方案是同一个,但是配置有可能不一样,今天记录一下通过修改配置文件使用新的 board 文件以及 config.h 进入 u-boot 2011.09 // 打 ...

  10. Ajax轮询——“定时的通过Ajax查询服务端”

    Ajax轮询——"定时的通过Ajax查询服务端". 概念: 轮询(polling):客户端按规定时间定时像服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 百闻 ...