您的位置:首页 > 编程语言 > Java开发

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

2013-03-12 10:49 776 查看
  我们在开发中,经常需要让对象了解自己所在的容器的信息,例如,有时我们需要让对象知道,对象所在容器的引用是什么,或者是对象在容器中的名称是什么 。Spring.Net 中提供了两个接口,我们使用这两个接口可以让对象了解自己的容器。

一 . IObjectFactoryAware 接口

  实现了 Spring.Objects.Factory.IObjectFactoryAware 接口 的对象可以在被容器创建后获取它所在容器的引用。该接口只有一个(只写的)属性:

IObjectFactory ObjectFactory:该属性会在初始化方法(IInitializingObject 的 AfterPropertiesSet 方法,或在对象定义中由 init-method 属性 指定的方法)完成后被赋值。

IObjectFactoryAware 接口 允许对象通过编程方式访问创建它的容器,一般主要用来在编程时获得容器内的其它对象。虽然这种方式在某些情况下(似乎)很有用,但我们应该尽量避免这么做,因为这会导致代码同 Spring.NET 发生紧耦合,并且违反了控制反转原则。

二 . IObjectNameAware 接口

  Spring.Objects.Factory.IObjectNameAware 接口 可让对象知道在容器中叫什么名称,如果对象需要知道自己在容器中的名称,可以实现该接口:

string ObjectName:该属性使实现了 IObjectNameAware 接口 的对象能够知道自己在容器中的名称。

我们来看代码:

Person 类,实现了 IPerson 接口,IPerson 接口有一个 SayHi() 方法,在 Person 类中还实现了 IObjectNameAware 和 IObjectFactoryAware 接口:

using System;
using Spring.Objects.Factory;

namespace CnblogLesson_4_8.Model
{
public class Person : IPerson, IObjectNameAware, IObjectFactoryAware
{
private string _objectName;
private IObjectFactory _iObjectFactory;

public void SayHi()
{
Console.WriteLine("我的容器是{0},我叫{1}",_iObjectFactory,_objectName);
}

public string ObjectName
{
set
{
_objectName = value;
Console.WriteLine("调用 IObjectNameAware 的设置 ObjectName 方法");
}

}

public IObjectFactory ObjectFactory
{
set
{
_iObjectFactory = value;
Console.WriteLine("调用IObjectFactoryAware 的设置 ObjectFactory 方法");
}

}
}
}


Objects.xml 配置:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">

<object id="hexu" type="CnblogLesson_4_8.Model.Person,CnblogLesson_4_8">
</object>

</objects>


主程序代码:

using System;
using Spring.Context;
using Spring.Context.Support;
using CnblogLesson_4_8.Model;

namespace CnblogLesson_4_8
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("\n\n\n");

//通过IApplicationContext来配置
IApplicationContext context = ContextRegistry.GetContext();

IPerson hexu = context.GetObject("hexu") as Person;
hexu.SayHi();

Console.ReadKey();
}
}
}


看一下结果:



通过 IObjectNameAware, IObjectFactoryAware 接口,我们可以获取 hexu 对象所在容器的引用,以及 在容器中该对象的名称。

示例代码 : http://download.csdn.net/detail/cilence6788/5132327
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: