zoukankan      html  css  js  c++  java
  • 第四章 Spring.Net 如何管理您的类___IObjectPostProcessor接口

      官方取名叫 对象后处理器 (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 作为容器 。

     

  • 相关阅读:
    Git实战(二)原理

    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现 蓝桥杯 历届试题 核桃的数量
    Java实现蓝桥杯 历届试题 k倍区间
    Java实现蓝桥杯 历届试题 k倍区间
    Java实现蓝桥杯 历届试题 k倍区间
  • 原文地址:https://www.cnblogs.com/hexu6788/p/2945985.html
Copyright © 2011-2022 走看看