在 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. C中的空宏定义,即只有一个参数

    空宏定义的测试代码 #include <stdio.h> #define D(x) int main() { D(printf("null macro")); retu ...

  2. ny655 光棍的yy 大数处理

    光棍的yy 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊. 现在给你m个1,你可以把2个 ...

  3. Ubuntu下安装JDK1.7

    Ubuntu操作系统下如何手动安装JDK1.7呢?本文是我经历的全过程. Ubuntu版本:12.04 LTS JDK版本:1.7.0_04 安装目录:/usr/local/development/j ...

  4. tab栏切换fengz

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. centos启动zookeeper

    切换到zookeeper的bin目录下,执行 ./zkServer.sh start

  6. Activiti进行时——企业工作流生命周期贯通 (zhuan)

    http://www.jianshu.com/p/e6971e8a8dad ********************************************** 图1:一个典型的审批工作流程 ...

  7. 【转】Hive优化总结

    优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解Hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结.   长期观察hadoo ...

  8. LeetCode: Longest Consecutive Sequence 解题报告

    Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longest con ...

  9. JDBC事务和JTA (XA)事务区别

    JDBC 事务 JDBC 事务是用 Connection 对象控制的.JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交. 在jd ...

  10. Gson json解析工具

    json 解析工具 ,谷歌出品 对象转换字符串 HashMap<String,String> hashMap = new HashMap<String, String>();  ...