Castle IOC容器内幕故事(下)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
摘要:上一篇文章我们了解了Castle IOC中注册组件的流程,为了更好的使用Castle IOC,本篇文章我们介绍一下Castle IOC中的几个重要的角色,开始Castle IOC容器内幕故事下角色介绍。
 
主要内容
1 ComponentModelBuilder  Contributors
2 Contributors分析
3 Handles分析
4 ComponentActivator分析
 
一.ComponentModelBuilder 和 Contributors
在前一篇中介绍组件的注册流程时说到了,创建 ComponentModel 的过程就是调用contributor来对组件进行处理的过程。Contributor就是我们这个内幕故事的第一个主角,在DefaultComponentModelBuilder一共注册了八个Contributor 每一个Contributor都专门负责处理某一方面的事情。如下代码所示:
protected   virtual   void  InitializeContributors()

{

    AddContributor( 
new ConfigurationModelInspector() );

    AddContributor( 
new LifestyleModelInspector() );

    AddContributor( 
new ConstructorDependenciesModelInspector() );

    AddContributor( 
new PropertiesDependenciesModelInspector() );

    AddContributor( 
new MethodMetaInspector() );

    AddContributor( 
new LifecycleModelInspector() );

    AddContributor( 
new ConfigurationParametersInspector() );

    AddContributor( 
new InterceptorInspector() );

}


//   [url]http://terrylee.cnblogs.com[/url]

1 ConfigurationModelInspector:用来处理配置,它使用ConfigurationStoreKernel中注册来保持一个组件的连接。
2 LifestyleModelInspector :生命周期处理方式,主要有SingletonThreadTransientPooledCustom这些都可以在配置文件中指定,后续文章会讲到。
3 ConstructorDependenciesModelInspector:处理构造函数依赖,收集所有的Public构造函数,并它们交给ComponentModelConstructors集合。
4 PropertiesDependenciesModelInspector:处理属性依赖,收集所有的可写的属性,Kernel也许不会在组件注册时就设置所有的属性,也有可能在请求获取组件时来设置。
5 MethodMetaInspector:检测组件配置中的Method节点,每一个节点都将添加到ComponentModelMethod集合中。
6 LifecycleModelInspector:处理组件生命周期,即在组件装载,初始化,销毁所出发的行为,分别对应三个接口:IInitializable,ISupportInitialize,IDisposable,如果组件实现了这些接口,容器会自动在不同的生命周期调用它们。
7 ConfigurationParametersInspector:处理配置文件中的parameters元素内容,每一个parameters都将创建一个ParameterModel,并添加到ComponentModelParameters集合中。
8 InterceptorInspector:处理InterceptorAttribute或者配置文件中的interceptors元素的信息。
在有些情况下,我们可能并不需要这么多的Contributors,或者说我们想添加自定义的Contributors,可以用ComponentModelBuilder的如下两个方法来实现对Contributors的管理:
public   void  AddContributor(IContributeComponentModelConstruction contributor)

{

    contributors.Add(contributor);

}


public   void  RemoveContributor(IContributeComponentModelConstruction contributor)

{

    contributors.Remove(contributor);

}


//   [url]http://terrylee.cnblogs.com[/url]

二. Contributors 分析
 
通过上面的分析可以看到 八个Contributors按一定顺序组合构成了整个组件的处理流程,现在我们来看一下Contributors是如何实现的?每一个Contributors都必须实现于接口IcontributeComponentModelConstruction,通过这个,我们可以创建自己的Contributors
public   interface  IContributeComponentModelConstruction
{
    
void ProcessModel(IKernel kernel, ComponentModel model);

}

//   [url]http://terrylee.cnblogs.com[/url]
来看一下其中 LifecycleModelInspector 的实现代码:
[Serializable]
public   class  LifecycleModelInspector : IContributeComponentModelConstruction
{
    
public LifecycleModelInspector()
    
{

    }


    
public virtual void ProcessModel(IKernel kernel, ComponentModel model)

    
{
        
if (typeof (IInitializable).IsAssignableFrom(model.Implementation))

        
{
            model.LifecycleSteps.Add( LifecycleStepType.Commission, InitializationConcern.Instance );

        }

        
if (typeof (ISupportInitialize).IsAssignableFrom(model.Implementation))
        
{
            model.LifecycleSteps.Add( LifecycleStepType.Commission, SupportInitializeConcern.Instance );

        }

        
if (typeof (IDisposable).IsAssignableFrom(model.Implementation))
        
{
            model.LifecycleSteps.Add( LifecycleStepType.Decommission, DisposalConcern.Instance );

        }

    }

}

//   [url]http://terrylee.cnblogs.com[/url]

至此,第一个主角 Contributors的故事就完了。
三.Handles分析
在组件注册流程中,还提到了一个重要的角色就是Handles。对Handles的描述引用Castle官方网站的一句话来说就是“They don't construct the component themselves, but they know who does”。Handles它有两个状态,分别标识组件是否可以被请求还是需要继续等待相关的依赖,所有的Handles都必须实现IHandles接口,通过这个也可以创建自己的Handle
public   enum  HandlerState
{
    Valid,

    WaitingDependency
}


public   interface  IHandler
{
    
void Init(IKernel kernel);

    
object Resolve();

    
void Release(object instance);

    HandlerState CurrentState 
get; }

    ComponentModel ComponentModel 
get; }

}

//   [url]http://terrylee.cnblogs.com[/url]
Handles 通过下面两个方法来检查哪些组件可以被请求,而哪些组件需要继续等待相关依赖,但是它并不做具体的组件创建工作。
public   override   object  Resolve()
{
    
if (CurrentState == HandlerState.WaitingDependency)
    
{
        String message 
= 

            String.Format(
"Can't create component '{1}' as it has dependencies to be satisfied. {0}"

                ObtainDependencyDetails(), ComponentModel.Name );
 
        
throw new HandlerException(message);
    }
   
    
return lifestyleManager.Resolve();
}


public   override   void  Release( object  instance)
{
    lifestyleManager.Release( instance );
}

//   [url]http://terrylee.cnblogs.com[/url]
 
四.ComponentActivator分析
介绍完前面三位角色之后,今天最后一位登场的主角就是ComponentActivator,组件激活器。每一个组件都和一个Activator相关联。Castle IOC为我们提供了默认的ActivatorCastle IOC已经为我们提供了默认的Activator,但有时候也需要自己去实现Activator,比如说创建组件的实例并不是new出来的,而是通过我们自定义的Factory方法创建的,或者说我们需要创建的组件一个Remoting组件。创建自定义的Activator需要继承于AbstractComponentActivator基类或者DefaultComponentActivator
[Serializable]
public   abstract   class  AbstractComponentActivator : IComponentActivator
{
    
private IKernel kernel;

    
private ComponentModel model; 

    
private ComponentInstanceDelegate onCreation;

    
private ComponentInstanceDelegate onDestruction;

    
public AbstractComponentActivator(ComponentModel model, IKernel kernel, 

        ComponentInstanceDelegate onCreation, 

        ComponentInstanceDelegate onDestruction)
    
{
        
this.model = model;

        
this.kernel = kernel;

        
this.onCreation = onCreation;

        
this.onDestruction = onDestruction;
    }


    
public IKernel Kernel
    
{
        
get return kernel; }
    }

    
public ComponentModel Model
    
{
        
get return model; }
    }


    
public ComponentInstanceDelegate OnCreation
    
{
        
get return onCreation; }
    }


    
public ComponentInstanceDelegate OnDestruction
    
{
        
get return onDestruction; }
    }


    
protected abstract object InternalCreate();

    
protected abstract void InternalDestroy(object instance);

    
IComponentActivator Members

}

//   [url]http://terrylee.cnblogs.com[/url]
 
关于Castle IOC内部主角分析就到这里了,至此Castle IOC的内幕故事也告一段落了,通过这两篇文章我们对Castle IOC的内幕有了一个简单的认识,这对于我们使用Castle IOC有很大的好处,后续文章会讲到。
参考资料
Castle 的官方网站[url]http://www.castleproject.org[/url]













本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67675  ,如需转载请自行联系原作者

相关文章
|
4月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
12月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
637 3
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
Spring5入门到实战------2、IOC容器底层原理
|
11月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
203 0
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
2月前
|
存储 监控 测试技术
如何将现有的应用程序迁移到Docker容器中?
如何将现有的应用程序迁移到Docker容器中?
219 57
|
2月前
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
216 58
|
2月前
|
NoSQL Redis Docker
使用Docker Compose工具进行容器编排的教程
以上就是使用Docker Compose进行容器编排的基础操作。这能帮你更有效地在本地或者在服务器上部署和管理多容器应用。
286 11