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

  Spring.Objects.Factory.Config.IObjectPostProcessor 接口,该接口包括两个方法:

  //在每个对象的初始化方法被调用之前调用

  object PostProcessBeforeInitialization(object instance, string name);

  //在对象的初始化方法返回之后调用

  object PostProcessAfterInitialization(object instance, string name);

  在把实现了该接口的对象作为 IObjectPostProcessor 注册给容器后,容器就会在每个对象的 初始化方法被调用之前 调用对象后处理器的 PostProcessBeforeInitialization方法,初始化方法可以是 IInitializingObject 接口 的 AfterPropertiesSet 方法,也可以是通过对象定义(按:init-method属性)指定的任意方法;在对象的初始化方法返回之后,容器就会调用对象后处理器的 PostProcessAfterInitialization 方法。(按:IObjectPostProcessor 只对指定了初始化方法的对象有效)

  来看一下代码,该类实现了 IObjectPostProcessor 接口:

 1 using System;
2 using Spring.Objects.Factory.Config;
3
4 namespace CnblogLesson_4_7
5 {
6 public class HexuObjectPostProcessor : IObjectPostProcessor
7 {
8 public object PostProcessAfterInitialization(object instance, string objectName)
9 {
10 Console.WriteLine("我调用了对象后处理器的 PostProcessAfterInitialization 方法,当前的对象是{0}", objectName);
11 return instance;
12
13 }
14
15 public object PostProcessBeforeInitialization(object instance, string name)
16 {
17 Console.WriteLine("我调用了对象后处理器的 PostProcessBeforeInitialization 方法,当前的对象是{0}", name);
18 return instance;
19 }
20 }
21
22 }

Person.cs 有两个方法,一个是初始化方法,一个是销毁方法:

 1 using System;
2
3 namespace CnblogLesson_4_7.Model
4 {
5 public class Person
6 {
7 public void Init()
8 {
9 Console.WriteLine("我调用了初始化方法");
10 }
11
12 public void Destroy()
13 {
14 Console.WriteLine("我调用的释放的方法");
15 }
16
17 }
18 }

  我们在Objects.xml文件上将 HexuObjectPostProcessor 注册到上下文对象中去:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3
4 <!--我们在Object.xml文件上将HexuObjectPostProcessor注册到上下文对象中去-->
5 <object id="hexu" type="CnblogLesson_4_7.Model.Person,CnblogLesson_4_7" init-method="Init" destroy-method="Destroy"/>
6 <object type="CnblogLesson_4_7.HexuObjectPostProcessor,CnblogLesson_4_7"/>
7
8 </objects>

  程序运行起来看:

  大家可以看到我们通过实现 HexuObjectPostProcessor 类,然后将它注册到上下文之后,HexuObjectPostProcesso 的方法

 object PostProcessBeforeInitialization(object instance, string name); 在每个对象的初始化方法被调用之前调用了。HexuObjectPostProcesso 的方法

 object PostProcessAfterInitialization(object instance, string name); 在对象的初始化方法返回之后调用了。

  IObjectPostProcessor (对象后处理器) 可以对一个对象做任何操作,当然也可以不做任何事情而直接退出。后处理器通常用于检查标识接口,或将对象包装到某个代理对象中。Spring.Net 中的一些辅助类实现了IObjectPostProcessor接口。如下图

  IObjectPostProcessor 另有两个扩展接口:IInstantiationAwareObjectPostProcessor 和 IDestructionAwareObjectPostProcessor

  IinstantiationAwareObjectPostProcessor 接口的定义:

  IDestructionAwareObjectPostProcessor接口的定义:

  PostProcessBeforeInstantiation 方法由容器在创建对象前调用。如果该方法的返回值不为空,那么容器的默认初始化行为就会被短路。返回的对象会代替原来的对象被注册到容器,且不会再向它应用任何 IObjectPostProcessor 。当希望获取一个对象的代理而非对象本身时,该机制非常有用。

  PostProcessBeforeDestruction 方法会在一个 singleton对象 被销毁前调用。(按:IObjectPostProcessor 接口的两个方法只对指定了初始化方法的对象有效,而IInstantiationAwareObjectPostProcessor 接口 和 IDestructionAwareObjectPostProcessor 接口 的方法会在每个对象创建或销毁前调用。)

  注意:IObjectFactory 的实现类和 IApplicationContext 的实现类在对象后处理器的处理方式上稍微不同。IApplicationContext 会自动检测布署到其中的对象,如果对象实现了 IObjectPostProcessor 接口,就将其注册为对象后处理器,并在适当的时候调用 。对象后处理器的对象定义与普通对象完全一样。但对 IObjectFactory 的实现类来说,对象后处理器就必须显式的手工添加,如以下代码所示:

ConfigurableObjectFactory factory = new .....; // 这里创建一个IobjectFactory的实现

... // 注册一些对象

// 注册需要的 IObjectPostProcessors

HexuObjectPostProcessor pp = new HexuObjectPostProcessor();

factory.AddObjectPostProcessor(pp);

// ...这时才能开始使用工厂

  由于手工注册的步骤并不方便,而 IApplicationContext 在功能上又是 IObjectFactory 的超集,所以,当需要使用对象后处理器的时候,推荐使用 IApplicationContext 作为容器 。

第四章 Spring.Net 如何管理您的类___IObjectPostProcessor接口的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 转载:Jmeter教程索引

    摘自: 阳光温暖了心情 的 http://www.cnblogs.com/yangxia-test/category/431240.html 1 JMeter学习(一)工具简单介绍 2 JMeter学 ...

  2. mongodump 失败且导致mongo服务挂掉【本质原因,wt文件损坏】

    ====================================================== 标题遇到的问题是我要解决的问题的中间环节. 原本问题是:需要在之前standlone的Mo ...

  3. Session 活化与钝化 与tomcat钝化驱动器

    1,绑定到Session中的 对象有多种状态,分别是   绑定   解除绑定     钝化    活化. 绑定 是保存,通过session.setattribute把对象保存到session的对象当中 ...

  4. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...

  5. js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结【转】

    [摘要:之前常常正在代码中看到Math.round.parseInt.Math.floor战Math.ceil那四个函数,固然晓得效果皆能够返回一个整数,然则对他们四者的差别照样没有太清晰,本日便做一 ...

  6. 支持移动触摸设备的简洁js幻灯片插件

    lory是一款支持移动触摸设备的简洁的js幻灯片插件.该幻灯片插件可以通过纯js调用,也可以将该幻灯片插件作为jQuery插件来使用.该幻灯片的过渡动画具有硬件加速功能,并且可以定制是否使用easin ...

  7. 模板方法模式(Head first 设计模式——7)

    一.模板方法模式定义 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 从定义中,应该可以看出一部分,为 ...

  8. C语言 · 素数求和

    算法提高 素数求和   时间限制:1.0s   内存限制:256.0MB      问题描述 输入一个自然数n,求小于等于n的素数之和 样例输入 2 样例输出 2 数据规模和约定 测试样例保证 2 & ...

  9. BusyBox telnet配置

    1.  busybox配置telnet相关命令. 2.  devpts文件系统,是目前最常见的pseudo终端,使用telnetd服务器,必须加载该文件系统. 在/dev目录下创建一个pts目录,用来 ...

  10. Qt学习之路(tip): parent参数

    这是一篇很简单的文章,仅仅是用来说明一下一个参数的作用,因此我把它写成了tip,而不是接下来的17.   程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数.这个参数通常是QO ...