Castle IOC容器与Spring.NET配置之比较

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别。在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的依赖关系,我们无需自己编写XML配置文件来配置组件之间的依赖关系。在Spring.NET中也是支持自动装配的,但是并不推荐使用,它贯穿着一种思想就是一切皆为XML配置,这是两者之间最大的一个区别。

关于自动装配,来自于Spring.NET的支持者认为让容器自动管理,会让我们无法控制组件的依赖关系,如果该为XML配置,可以让我们知道自己在做什么,我们指定了哪些依赖关系,方便进行控制和管理;而来自于Castle IOC的支持者认为如果不让容器自动管理,手工配置会变得非常之复杂,配置文件也会变得非常繁冗,如果系统中的组件非常之多的时候,管理工作会变得很困难。

我们来看一个简单的例子,有这样一个组件 MyMainComponent ,它依赖于MyComponent1MyComponent2,并且它在构造函数中还需要接收一个整型的参数。

None.gif // 出处: [url]http://terrylee.cnblogs.com[/url]
None.gif

None.gif
public   class  MyMainComponent
ExpandedBlockStart.gif
{
InBlock.gif    MyComponent1 _com1;
InBlock.gif
InBlock.gif    MyComponent2 _com2;
InBlock.gif
InBlock.gif    
int _i;
InBlock.gif
InBlock.gif    
public MyMainComponent(MyComponent1 com1,MyComponent2 com2,int i)
ExpandedSubBlockStart.gif    
{
InBlock.gif        
this._com1 = com1;
InBlock.gif
InBlock.gif        
this._com2 = com2;
InBlock.gif
InBlock.gif        
this._i = i;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyComponent1
ExpandedBlockStart.gif
{
InBlock.gif    
public MyComponent1()
ExpandedSubBlockStart.gif    
{
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyComponent2
ExpandedBlockStart.gif
{
InBlock.gif    
public MyComponent2()
ExpandedSubBlockStart.gif    
{
InBlock.gif        
//dot.gifdot.gif
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

如果用采用 Spring.NET,它采用 XML进行组件之间的连接,配置文件如下,需要在配置文件中指定每一个对象及其它们之间的依赖,同时在配置文件中区分是构造函数还是其他方法:
None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< object  id ="myManComponent"  class ="CastleDemo.MyMainComponent, CastleDemo" >
None.gif
None.gif        
< constructor-arg >
None.gif
None.gif            
< ref  object ="mycomponent1"   />
None.gif
None.gif        
</ constructor-arg >
None.gif
None.gif        
< constructor-arg >
None.gif
None.gif            
< ref  object ="mycomponent2"   />
None.gif
None.gif        
</ constructor-arg >
None.gif
None.gif        
< constructor-arg >
None.gif
None.gif            
< value > 1 </ value >
None.gif
None.gif        
</ constructor-arg >
None.gif
None.gif    
</ object >
None.gif
None.gif    
< object  id ="mycomponent1"  class ="CastleDemo.MyComponent1, CastleDemo"   />
None.gif
None.gif    
< object  id ="mycomponent2"  class ="CastleDemo.MyComponent2, CastleDemo"   />
None.gif
None.gif
</ configuration >

Castle IOC 中同样需要配置文件,但相比之下,就简单了很多:

None.gif <!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->
None.gif
None.gif
<? xml version="1.0" encoding="utf-8"  ?>
None.gif
None.gif
< configuration >
None.gif
None.gif    
< components >
None.gif
None.gif        
< component  id ="myMainComponent" >
None.gif
None.gif            
< parameters >
None.gif
None.gif                
< i > 1 </ i >
None.gif
None.gif            
</ parameters >
None.gif
None.gif        
</ component >
None.gif
None.gif    
</ components >
None.gif
None.gif
</ configuration >

Castle IOC中的配置并不需要指定组件之间的关联,它会自动通过 Windsor来处理;我们只是配置了一个参数 i,这个 iMyMainComponent中的构造函数中不存在依赖关系的那个参数。

None.gif // 出处: [url]http://terrylee.cnblogs.com[/url]
None.gif

None.gif
public   class  App
ExpandedBlockStart.gif
{
InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gif    
{
InBlock.gif        IWindsorContainer container 
= new WindsorContainer(new XmlInterpreter("../../BasicUsage.xml") );
InBlock.gif
InBlock.gif        container.AddComponent( 
"myMainComponent"
InBlock.gif
InBlock.gif            
typeof(MyMainComponent));
InBlock.gif
InBlock.gif        container.AddComponent( 
"myComponent1"
InBlock.gif
InBlock.gif            
typeof(MyComponent1));
InBlock.gif
InBlock.gif        container.AddComponent( 
"myComponent2"
InBlock.gif
InBlock.gif            
typeof(MyComponent2));          
InBlock.gif
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
这样添加组件后, WindsorContainer 会自动调用 MicroKernel 中的ConstructorDependenciesModelInspector来处理组件的构造函数依赖。

通过上面的这个简单例子比较可以看出,如果我们想要增加一个组件之间的依赖关系或者增加一个组件使用Castle要比使用Spring.NET容易很多,Spring.NET复杂的配置文件会给我们开发带来很来不可预料的错误;Castle根据对象的依赖关系,采用自动装配,不需要配置组件的依赖,另外为了符合构造注入和属性注入,Castle的配置文件并没有像Spring.Net那样区分构造函数还是其他的方法,同时直接使用Parameters,而不是使用构造函数参数之类的区分。

 

参考资料

Castle 的官方网站[url]http://www.castleproject.org[/url]
















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

相关文章
|
11天前
|
SQL Java 数据库连接
(自用)Spring常用配置
(自用)Spring常用配置
15 0
|
1月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
Java 测试技术 开发工具
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
ApplicationArguments读取应用程序参数并注入到IOC容器
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
40 1
|
3天前
|
存储 安全 Java
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
13 0
|
3天前
|
安全 Java 数据库
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(上)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)
28 0
|
5天前
|
安全 Java Spring
Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
17 0
|
5天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
9 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
10天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
18 1
|
10天前
|
Java 数据库连接 Spring
简化配置,提高灵活性:Spring中的参数化配置技巧
简化配置,提高灵活性:Spring中的参数化配置技巧
19 0