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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
我本人对于Spring.NET并不了解,本文只是通过一个简单的例子来比较一下两者配置之间的区别。在Castle IOC容器中,提出了自动装配(Auto-Wiring)的概念,即由容器自动管理组件之间的依赖关系,我们无需自己编写XML配置文件来配置组件之间的依赖关系。在Spring.NET中也是支持自动装配的,但是并不推荐使用,它贯穿着一种思想就是一切皆为XML配置,这是两者之间最大的一个区别。
关于自动装配,来自于Spring.NET的支持者认为让容器自动管理,会让我们无法控制组件的依赖关系,如果该为XML配置,可以让我们知道自己在做什么,我们指定了哪些依赖关系,方便进行控制和管理;而来自于Castle IOC的支持者认为如果不让容器自动管理,手工配置会变得非常之复杂,配置文件也会变得非常繁冗,如果系统中的组件非常之多的时候,管理工作会变得很困难。
我们来看一个简单的例子,有这样一个组件 MyMainComponent ,它依赖于MyComponent1MyComponent2,并且它在构造函数中还需要接收一个整型的参数。
// 出处: [url]http://terrylee.cnblogs.com[/url]

public   class  MyMainComponent
{
    MyComponent1 _com1;

    MyComponent2 _com2;

    
int _i;

    
public MyMainComponent(MyComponent1 com1,MyComponent2 com2,int i)
    
{
        
this._com1 = com1;

        
this._com2 = com2;

        
this._i = i;
    }

}


public   class  MyComponent1
{
    
public MyComponent1()
    
{
        
//
    }

}


public   class  MyComponent2
{
    
public MyComponent2()
    
{
        
//
    }

}

如果用采用 Spring.NET,它采用 XML进行组件之间的连接,配置文件如下,需要在配置文件中指定每一个对象及其它们之间的依赖,同时在配置文件中区分是构造函数还是其他方法:
<!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->

<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< object  id ="myManComponent"  class ="CastleDemo.MyMainComponent, CastleDemo" >

        
< constructor-arg >

            
< ref  object ="mycomponent1"   />

        
</ constructor-arg >

        
< constructor-arg >

            
< ref  object ="mycomponent2"   />

        
</ constructor-arg >

        
< constructor-arg >

            
< value > 1 </ value >

        
</ constructor-arg >

    
</ object >

    
< object  id ="mycomponent1"  class ="CastleDemo.MyComponent1, CastleDemo"   />

    
< object  id ="mycomponent2"  class ="CastleDemo.MyComponent2, CastleDemo"   />

</ configuration >

Castle IOC 中同样需要配置文件,但相比之下,就简单了很多:
<!-- 出处:[url]http://terrylee.cnblogs.com[/url] -->

<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< components >

        
< component  id ="myMainComponent" >

            
< parameters >

                
< i > 1 </ i >

            
</ parameters >

        
</ component >

    
</ components >

</ configuration >

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

public   class  App
{
    
public static void Main()
    
{
        IWindsorContainer container 
= new WindsorContainer(new XmlInterpreter("../../BasicUsage.xml") );

        container.AddComponent( 
"myMainComponent"

            
typeof(MyMainComponent));

        container.AddComponent( 
"myComponent1"

            
typeof(MyComponent1));

        container.AddComponent( 
"myComponent2"

            
typeof(MyComponent2));          

    }

}
这样添加组件后, 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  ,如需转载请自行联系原作者

相关文章
|
5天前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
34 0
|
13天前
|
域名解析 网络协议 API
【Azure Container App】配置容器应用的缩放规则 Managed Identity 连接中国区 Azure Service Bus 问题
本文介绍了在 Azure Container Apps 中配置基于自定义 Azure Service Bus 的自动缩放规则时,因未指定云环境导致的域名解析错误问题。解决方案是在扩展规则中添加 `cloud=AzureChinaCloud` 参数,以适配中国区 Azure 环境。内容涵盖问题描述、原因分析、解决方法及配置示例,适用于使用 KEDA 实现事件驱动自动缩放的场景。
|
3月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
381 2
|
4月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
143 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
11天前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
|
4月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
201 0
|
4月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
69 0
|
4月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
263 0
|
8天前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
35 0
|
2月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。