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

  传统的Net应用中,对象的生命周期非常简单。.Net中的关键词 new 用来实例化对象(或许它是非序列化的)。这样就够用了。相反,对象 的生命周期在 Spring.Net 容器中更加细致。理解 Spring.Net 对象的生命周期非常重要,因为你或许要利用 Spring.Net 提供的机制来订制对象的创建过程。我们在前面几章讨论了 Spring.Net 对象生命周期中大部分常用的细节。本小节我们来把前面零零散散的这些细节汇总一下。

一 . IObjectFactory 中的生命周期

  下面这附图是 Spring.Net 对象在 IObjectFactory 中的生命周期:

(1)     容器寻找到对象的 定义信息 并且将其实例化。

(2)     受用依赖注入,Spring.Net 按照对象定义信息配置对象的所有属性。

(3)     如果对象实现了 IObjectNameAware 接口,工厂调用对象的设置 ObjectName 的方法传入对象名称。

(4)     如果对象实现了 IObjectFactoryAware 接口,工厂调用对象的设置 ObjectFactory 的方法传入工厂自身。

(5)     如果 IObjectPostProcessor 实现类和对象关联,那么它们的 PostProcessBeforeInitialization 方法将被调用。

(6)     如果对象指定了 init-method 方法,它将被调用。

(7)     如果有 IObjectPostProcessor 实现类和对象关联,那么它们的 PostProcessAfterInitialization 方法将被调用。 到这个时候,对象已经可以被应用系统使用了,并且将被保留在 IObjectFactory 中。如果知道它不再需要了,则有两种常见的方法可以把它从 对象 Factory 中删除掉。

  ① 如果对象实现了 System.IDisposable 接口,Dispose() 方法被调用。

  ② 如果指定了订制的销毁方法,就调用这个方法。

二 . IApplicationContext的生命周期

  对象在 IApplicationContext 的生命周期与在 IObjectFactory 中的生命周期只有一点不同,唯一不同的是,如果对象实现了 IApplicationContextAware 接口,设置ApplicationContext 的方法被调用。如下图:

  下面,我们用代码的方式来看下 对象的生命周期链 。废话不多说,直接上代码,来看:

 1 using System;
2 using Spring.Objects.Factory;
3 using Spring.Context;
4
5 namespace CnblogLesson_4_9.Model
6 {
7 public class Person : IPerson, IObjectNameAware, IObjectFactoryAware, IApplicationContextAware
8 {
9 private string _objectName;
10 private IObjectFactory _iObjectFactory;
11 private IApplicationContext applicationContext;
12
13 public Person() {
14 Console.WriteLine("调用Person的构造函数");
15 }
16
17 public void Init() {
18 Console.WriteLine("调用Person的Init方法");
19 }
20
21 public void Destroy() {
22 Console.WriteLine("调用Person的Destroy方法");
23 }
24
25 public string ObjectName
26 {
27 set {
28 _objectName = value;
29 Console.WriteLine("调用IObjectNameAware的设置ObjectName方法");
30 }
31 }
32
33 public IObjectFactory ObjectFactory
34 {
35 set
36 {
37 _iObjectFactory = value;
38 Console.WriteLine("调用IObjectFactoryAware的设置ObjectFactory方法");
39 }
40 }
41
42 public IApplicationContext ApplicationContext
43 {
44 set
45 {
46 applicationContext = value;
47 Console.WriteLine("调用IApplicationContextAware的设置ApplicationContext方法");
48 }
49 }
50 }
51 }

  Person 这个类实现 ,IPerson, IObjectNameAware, IObjectFactoryAware, IApplicationContextAware 接口。

 1 using System;
2 using Spring.Objects.Factory.Config;
3
4 namespace CnblogLesson_4_9.Model
5 {
6 class HexuObjectPostProcessor : IObjectPostProcessor
7 {
8 public object PostProcessAfterInitialization(object instance, string objectName)
9 {
10 Console.WriteLine("调用了IObjectPostProcessor的PostProcessAfterInitialization方法");
11 return instance;
12
13 }
14
15 public object PostProcessBeforeInitialization(object instance, string name)
16 {
17 Console.WriteLine("调用了IObjectPostProcessor的PostProcessBeforeInitialization方法");
18 return instance;
19 }
20 }
21 }

  HexuObjectPostProcessor 实现了 IObjectPostProcessor 接口。

  Objects.xml 的配置如下:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3
4 <object id="hexu" type="CnblogLesson_4_9.Model.Person,CnblogLesson_4_9" init-method="Init" destroy-method="Destroy"/>
5
6 <object type="CnblogLesson_4_9.Model.HexuObjectPostProcessor,CnblogLesson_4_9"/>
7 </objects>

  然后我们来运行程序:

  通过结果,我们可以看到,Spring.Net 中 对象的生命周期链的全过程。

  Spring.Net 提供了一个容器(大工厂),通过这个容器我们可以完成:组件实例化,依赖装配,生命周期控制;

  有了这个容器后开发就变成这样:

  ① 使用和配置是分离的,程序关心是如何做事情,而不关心依赖从哪里来,程序只关心你把东西给我就行。由容器通过读取相应的配置来完成依赖注入。

  ② 配置分离后,我们可以通过更改配置来改变,程序的策略,而不需要重新编译代码。

  ③ 提供了一个对象生命周期链条,在这个链条上可以完成很多事情,如:装载,实例化,销毁等等。

第四章 Spring.Net 如何管理您的类___对象的生命周期链的更多相关文章

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

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

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

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

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

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

  4. 第四章 Spring.Net 如何管理您的类___对象的初始化方式

    在 Spring.Net 中对象初始化的方式分为两种: ① 急切实例化,也就是说 Spring.Net 容器初始化的时候将对象先实例化出来. ② 延迟实例化,也就是说我们在调用 GetObject 方 ...

  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. 每日英语:Can Going In and Out of Air Conditioning Cause Colds?

    For most people, summer involves numerous daily shifts between scorching outdoor heat and frosty air ...

  2. maven install 跳过test方法

    方式1:用命令带上参数 mvn install -Dmaven.test.skip=true 方式2:在pom.xml里面配置 <build> <defaultGoal>com ...

  3. django admin 或xdmin list_display search_fields list_filter 如果显示搜索外键或多对多字段

    model class UserProfile(AbstractUser): nick_name = models.CharField(max_length=50, verbose_name=u&qu ...

  4. 关于HTML、XHTML、CSS、XML的区别

    1.HTML(Hyper Text Mark-up Language) HTML(Hyper Text Mark-up Language)即超文本标记语言或超文本链接标示语言,是为“网页创建和其他可在 ...

  5. 使用 FreeRTOS 时注意事项总结(基础篇教程完结)

    以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...

  6. 问题-DelphiXE10.2怎么安装文本转语音(TTS)语音转文本(SR)控件(XE10.2+WIN764)

    相关资料: http://edn.embarcadero.com/article/29583 http://blog.sina.com.cn/s/blog_53866d7501017r1o.html ...

  7. 基于HTML5 SVG和CSS3炫酷蹦床式图片切换特效

    今天给大家分享一款效果非常炫酷的HTML5 SVG和CSS3蹦床式图片切换特效插件.该图片切换插件在进行图片切换时,整个屏幕就像一张大蹦床一样,将图片弹射出去,切换到另一张图片,效果非常有创意.效果图 ...

  8. 【Unity/Kinect】获取预制的手势信息KinectInterop.HandState

    Kinect使用了枚举KinectInterop.HandState来描述手势. 该手势指的是手掌的状态(张开/握拳),而不是说整个手臂的肢体动作(Gesture). 同样是需要嵌套在Kinect获取 ...

  9. USB 之传输编码格式 NRZI 介绍

    记录NRZI (Non-Return-to-Zero Inerted code) 非归零翻转编码,之前,我先稍微记录一下他的前身. RZ 编码(Return- to - zero coding) RZ ...

  10. BusyBox rcS&fstab配置

    rcS为系统初始化脚本,完成最开始的一些配置工作,可开启应用程序. #!/bin/shmount -a      ;mount文件,要mount的文件有fstab指定. . /etc/profile ...