Spring.NET通过几个专门的接口来控制容器中对象的行为,这些接口包括Spring.NET定义的IInitializingObject接口和标准的System.IDisposable接口。容器会在实现了这两个接口的对象上调用AfterPropertyiesSet()方法和Dispose()方法,这样我们就有机会在对象初始化和销毁时做一些额外的工作
IInitializingObject接口和init-method属性
Spring.Objects.Factory.IInitializingObject接口允许容器在完成对象的属性设置之后执行对象的初始化工作。该接口只有一个方法:
void AfterPropertiesSet():在对象的所有属性被设置之后由容器调用。在该方法中,我们可以检查必需的属性是否都已被正确设值,或者可以执行进一步的初始化工作。此方法可以抛出任何异常以标识配置错误、初始化失败等情况。
注意 | |
---|---|
一般来说,尽量不要使用IInitializingObject接口。因为在对象定义中可以通过init-method属性来指定初始化方法。 |
<object id="exampleInitObject" type="Examples.ExampleObject" init-method="init"/> [C#] public class ExampleObject { public void Init() { // do some initialization work } }
和下面的方法是一样的...
<object id="exampleInitObject" type="Examples.AnotherExampleObject"/> [C#] public class AnotherExampleObject : IInitializingObject { public void AfterPropertiesSet() { // do some initialization work } }
但在使用init-method时,无需对Spring.NET产生依赖。
注意 | |
---|---|
在布署prototype模式的对象时,容器无法处理对象的生命周期事件。Spring.NET不可能仅通过对象定义来完全控制非singleton/原型对象的生存期。对象一旦创建就会交付给客户代码,容器不再保存其引用。对于Spring.NET来说,非singleton对象就如同使用new操作符一样,所有与对象生命周期有关的工作都应该由客户代码来处理。 |
IDisposable接口和destroy-method属性
System.IDisposable接口使我们有机会在容器被销毁时,通过对象的回调方法来处理容器中对象的销毁工作。该接口只有一个方法:
void Dispose():当容器被销毁时调用。在此可释放对象保留的任何资源(比如数据库连接)。可在此方法中抛出任何异常,但是此处抛出的任何异常都不会阻止容器的销毁,只会被记录到日志中。
注意 | |
---|---|
由于在对象定义中(XML或数据库中)可以通过destroy-method来指定对象的清理方法,所以在使用Spring.NET时,可以不去实现IDisposable接口。 |
<object id="exampleInitObject" type="Examples.ExampleObject" destroy-method="cleanup"/> [C#] public class ExampleObject { public void cleanup() { // do some destruction work (such as closing any open connection (s)) } }
和下面的方式完全相同:
<object id="exampleInitObject" type="Examples.AnotherExampleObject"/> [C#] public class AnotherExampleObject : IDisposable { public void Dispose() { // do some destruction work } }