第四章 Spring.Net 如何管理您的类___对象的生命周期链
各位,实在不好意思,因为有事,博客几天没更新了。前面有童鞋提到,配置 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 如何管理您的类___对象的生命周期链的更多相关文章
- 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文
在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...
- 第四章 Spring.Net 如何管理您的类___对象的手动装配
前面我们知道了什么是对象,什么是对象工厂,什么是应用程序上下文.这一次我们来看一下对象的装配. Spring.Net 中有多种装配对象的方式,装配这个词可能比较学术化,我们可以理解为对象的创建. Sp ...
- 第四章 Spring.Net 如何管理您的类___对象的作用域
Spring.Net 中对象的作用域,就是描述对象的部署模式 ,Spring.Net 中对象可以通过两种模式布署: ① singleton(单例模式) ② 非singleton 也叫非单例模式(或者叫 ...
- 第四章 Spring.Net 如何管理您的类___对象的初始化方式
在 Spring.Net 中对象初始化的方式分为两种: ① 急切实例化,也就是说 Spring.Net 容器初始化的时候将对象先实例化出来. ② 延迟实例化,也就是说我们在调用 GetObject 方 ...
- 第四章 Spring.Net 如何管理您的类___对象的自动装配
由于这几天都比较忙,所以对笔记暂时没有更新. Spring.NET具有自动装配的能力,也就是说,Spring.NET可以通过对象的定义自动分辨某个对象的协作对象.自动装配是针对单个对象(按:针对每个协 ...
- 第四章 Spring.Net 如何管理您的类___统一资源访问接口
在前面章节有童鞋提到过 关于配置文件 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容,接下来就详细介绍一下 IResource 接口. IResource 接口 ...
- 第四章 Spring.Net 如何管理您的类___让对象了解自己的容器
我们在开发中,经常需要让对象了解自己所在的容器的信息,例如,有时我们需要让对象知道,对象所在容器的引用是什么,或者是对象在容器中的名称是什么 .Spring.Net 中提供了两个接口,我们使用这两个接 ...
- 第四章 Spring.Net 如何管理您的类___自定义对象行为
Spring.Net 一直讲求 ” 配置应用程序“,有一种需求在实际开发中不太常用,却非常有用 -> 配置对象的行为,Spring.Net 也能够完美的实现.Spring.Net 通过几个专门的 ...
- 第四章 Spring.Net 如何管理您的类___IObjectPostProcessor接口
官方取名叫 对象后处理器 (object post-processor) , 听起来很高级的样子啊!实际上就是所有实现了这个接口的类,增加了两个方法. Spring.Objects.Factory.C ...
随机推荐
- 每日英语: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 ...
- maven install 跳过test方法
方式1:用命令带上参数 mvn install -Dmaven.test.skip=true 方式2:在pom.xml里面配置 <build> <defaultGoal>com ...
- django admin 或xdmin list_display search_fields list_filter 如果显示搜索外键或多对多字段
model class UserProfile(AbstractUser): nick_name = models.CharField(max_length=50, verbose_name=u&qu ...
- 关于HTML、XHTML、CSS、XML的区别
1.HTML(Hyper Text Mark-up Language) HTML(Hyper Text Mark-up Language)即超文本标记语言或超文本链接标示语言,是为“网页创建和其他可在 ...
- 使用 FreeRTOS 时注意事项总结(基础篇教程完结)
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...
- 问题-DelphiXE10.2怎么安装文本转语音(TTS)语音转文本(SR)控件(XE10.2+WIN764)
相关资料: http://edn.embarcadero.com/article/29583 http://blog.sina.com.cn/s/blog_53866d7501017r1o.html ...
- 基于HTML5 SVG和CSS3炫酷蹦床式图片切换特效
今天给大家分享一款效果非常炫酷的HTML5 SVG和CSS3蹦床式图片切换特效插件.该图片切换插件在进行图片切换时,整个屏幕就像一张大蹦床一样,将图片弹射出去,切换到另一张图片,效果非常有创意.效果图 ...
- 【Unity/Kinect】获取预制的手势信息KinectInterop.HandState
Kinect使用了枚举KinectInterop.HandState来描述手势. 该手势指的是手掌的状态(张开/握拳),而不是说整个手臂的肢体动作(Gesture). 同样是需要嵌套在Kinect获取 ...
- USB 之传输编码格式 NRZI 介绍
记录NRZI (Non-Return-to-Zero Inerted code) 非归零翻转编码,之前,我先稍微记录一下他的前身. RZ 编码(Return- to - zero coding) RZ ...
- BusyBox rcS&fstab配置
rcS为系统初始化脚本,完成最开始的一些配置工作,可开启应用程序. #!/bin/shmount -a ;mount文件,要mount的文件有fstab指定. . /etc/profile ...