zoukankan      html  css  js  c++  java
  • 第四章 Spring.Net 如何管理您的类___对象的初始化方式

    在 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("刚刚执行到这里!"); ,执行之后才被初始化的。

  • 相关阅读:
    lightoj1422_区间dp
    hdu4283_动态规划
    51nod1201_dp思维题
    uestc1218_变形01背包
    hdu5492_枚举dp
    hdu3507_斜率dp
    hdu 1116 Play on Words
    并查集专题
    uva 10160
    uva 572
  • 原文地址:https://www.cnblogs.com/siyunianhua/p/6807838.html
Copyright © 2011-2022 走看看