`
dyllove98
  • 浏览: 1405326 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39053
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80060
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133167
社区版块
存档分类
最新评论

第四章 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 作为容器 。

示例代码 : http://download.csdn.net/detail/cilence6788/5114200

分享到:
评论

相关推荐

    [企业政府]达达ASP.NET企业信息管理系统(Spring.NET修改版)_dadaenter.zip源码ASP.NET网站源

    [企业政府]达达ASP.NET企业信息管理系统(Spring.NET修改版)_dadaenter.zip源码ASP.NET网站源[企业政府]达达ASP.NET企业信息管理系统(Spring.NET修改版)_dadaenter.zip源码ASP.NET网站源[企业政府]达达ASP.NET企业...

    spring.net_ibatis.net_mysq

    综上所述,"spring.net_ibatis.net_mysq"这个项目可能是展示如何在.NET环境中利用Spring.NET、iBatis.NET和MySQL来构建一个高效、灵活的数据库驱动应用的示例。通过学习和实践这个示例,开发者可以更好地理解这三个...

    Spring.NET框架参考文档_中文版

    4. **数据访问抽象(Data Access Abstraction)**:Spring.NET提供了数据库访问的抽象层,支持ORM(对象关系映射)工具如NHibernate,以及ADO.NET的直接使用。它允许开发者解耦业务逻辑和数据访问代码,提高代码的可...

    [企业政府]达达ASP.NET企业信息管理系统(Spring.NET修改版)_dadaenter(ASP.NET源码).rar

    【企业政府】达达ASP.NET企业信息管理系统(Spring.NET修改版)_dadaenter是一个基于ASP.NET技术构建的企业级信息管理系统,经过Spring.NET框架的优化和改进。这个系统旨在为企事业单位提供一套高效、稳定且可扩展的...

    Spring.Net_2.0.0以及中文参考文档

    4. **事务管理**:Spring.NET的事务管理器可以处理不同类型的事务策略,如编程式事务管理和声明式事务管理。这使得开发者可以在不关心底层实现的情况下,轻松地管理事务。 5. **Web应用程序支持**:Spring.NET Web...

    asp.net_spring_nhibernate_oracle

    asp.net_spring_nhibernate_oracle 网上关于在.net开发的例子不多,这个例子能跑,遗憾的是,nhibernate在存储过程不完美,在oracle 传回多结果集,只能接受到第一个,官网上也是这样说的。 提示:开发前,先将...

    [Ioc容器] Spring.NET 1.3.2

    Spring.NET is an open source application framework that makes building enterprise .NET applications easier; Providing components based on proven design patterns that can be integrated into all tiers...

    Spring.NET框架Document_CN

    4. **数据访问支持**:Spring.NET框架包含了对多种数据访问技术的支持,如ADO.NET、NHibernate、Entity Framework等,简化了数据库操作,并提供了事务管理功能。 5. **Web应用支持**:Spring.NET提供了Web应用开发...

    Spring.Net的实例

    在"SpringTest"这个例子中,可能包含了一些使用Spring.NET编写的示例代码,比如配置文件、控制器、服务接口及其实现、DAO层的代码等。通过分析和运行这些示例,你可以更好地理解Spring.NET如何在实际项目中工作,...

    Spring.Net开发WebService

    - 使用Spring.NET的`Spring.Web.Services`命名空间,你可以定义服务契约(接口)和实现契约的服务类。 - 通过添加`[WebService]`和`[WebMethod]`特性,你可以声明服务操作并指定它们的行为。 - Spring.NET的`...

    Spring.net 2.0及中文api下载

    4. **数据访问抽象**:Spring.NET提供了数据访问抽象层,包括对ADO.NET、NHibernate等ORM框架的支持,简化了数据库操作。 5. **Web支持**:Spring.NET提供了Web开发的支持,包括Model-View-Controller(MVC)框架,...

    nhibernate,spring.net

    标题中的“nhibernate”和“spring.net”是指两种流行的.NET框架,它们在企业级应用开发中扮演着重要角色。nHibernate是一个对象关系映射(ORM)工具,而Spring.NET是.NET平台上的一个全面的企业级应用框架。这两个...

    Spring.NET框架参考文档

    4. **数据访问抽象**:Spring.NET提供了数据访问抽象层,支持多种数据库技术,如ADO.NET、NHibernate、Entity Framework等,降低了数据访问层与业务逻辑层之间的耦合。 5. **事务管理**:Spring.NET提供了一种统一...

    Spring.NET-1.3.2

    4. **事务管理**:Spring.NET提供了声明式和编程式的事务管理,可以跨不同的数据访问技术进行事务控制,简化了事务处理的复杂性。 5. **对象/关系映射集成**:通过与ORM框架如NHibernate的集成,Spring.NET帮助...

    Spring.net+hibernate实例

    我们可以定义接口,然后在配置文件中指定其实现类,Spring.NET会在运行时自动注入这些依赖。这样,我们无需在代码中硬编码依赖,提高了代码的可读性和可维护性。 接下来,Nhibernate作为ORM框架,为我们提供了一种...

    353_asp.net仓库管理系统_库存管理系统_销售管理_进销存管理.rar

    标题中的“353_asp.net仓库管理系统_库存管理系统_销售管理_进销存管理.rar”表明这是一个基于ASP.NET技术开发的仓库管理、库存管理、销售管理和进销存一体化的软件系统。该系统可能涵盖了从商品采购入库到销售出库...

    spring.net整合webservice实例

    在.NET平台上,Spring.NET是一个强大的轻量级框架,它提供了依赖注入、面向切面编程以及企业服务等核心功能。本文将深入探讨如何利用Spring.NET来整合Web服务,从而实现更高效、灵活的服务消费和提供。 首先,理解...

    spring.net 中文文档

    Spring.NET是中国开发者为.NET平台开发的一个轻量级框架,它借鉴了Java平台上的Spring框架设计理念,旨在简化.NET应用的开发,提高代码的可测试性和可维护性。这个压缩包文件包含的是Spring.NET的中文文档,对于想要...

    Spring.net Aop 例子

    Spring.NET会创建一个实现了这些接口的代理类,当调用接口方法时,代理会先执行预定义的切面(Advice),然后转发调用给实际的目标对象。这种方式简单且高效,但仅限于接口实现。 2. **基于类型(TypeProxy)**:...

    Spring.Net2.0.1+Nhibernate4

    Spring.NET2.0.1与NHibernate4的整合是一个强大的组合,为.NET开发人员提供了灵活、可测试和可扩展的应用程序架构。Spring.NET是一个开源的轻量级.NET框架,它借鉴了Java Spring框架的设计理念,提供了依赖注入、AOP...

Global site tag (gtag.js) - Google Analytics