好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring.Net 如何管理您的类___对象的自动装配

Spring.Net 如何管理您的类___对象的自动装配

Spring.Net 如何管理您的类___对象的自动装配

 由于这几天都比较忙,所以对笔记暂时没有更新。

  Spring.NET具有自动装配的能力,也就是说,Spring.NET可以通过对象的定义自动分辨某个对象的协作对象。自动装配是针对单个对象(按:针对每个协作对象)进行的,所以可对某些对象启用自动装配而某些对象关闭自动装配(按:即自动装配某些协作对象,而不自动装配其它协作对象)。使用自动装配可以减少甚至完全消除属性或参数值的设置工作。

  上面是官方的定义,有点难懂,说白了就是,在使用大部分框架,包括Spring.Net 框架进行软件开发的过程中都有着复杂的配置文件,而Spring.Net 却提供了一套可以让程序员偷懒(少写配置文件)的机制。可以想象,我们的系统中有大量复杂的业务逻辑时,Objects.xml文件中会有多少<object id=”….” Type=”…”>….</object>标签。而这个能减少配置的机制就叫 自动装配。

  自动装配就是指Spring.Net根据指定的自动模式查找相关属性并自动装配,通过这样的方式来减少配置。

  目前自动装配有五种模式:

no  :不进行自动装配。这是默认的设置,一般不建议修改该设置,因为显式指定对象的协作关系可以让开发人员很清楚自己在干什么,并且有助于为软件结构建立文档。 byName  : Spring.NET 会检查容器中的对象,查找和被装配属性完全同名的对象定义,并将其作为该属性的值。例如,如果将一个对象定义设置为按名称装配,且该对象有一个名为 Name 的属性,Spring.NET 就会查找名为 Name 的对象定义,并将其作为 Name 属性的值。也就是说使用byName试图在容器中查找与属性名称相同的Object的id,如果没有找到,则此属性装配不成功。 byType  : Spring.NET 会根据指定的类型来查找协作对象。假设某对象定义有一个类型为 Person 的协作对象,Spring.NET 会在整个对象工厂中查找类型为 Person 的对象定义来为其装配。如果找不到该类型的对象,或者找到了不止一个此类型的对象,Spring.NET 会抛出异常,也就无法对此对象进行自动装配了,试图在容器中查询与属性类型相同的 Object,如果没有找到,则此属性装配不成功。如果找多个类型相符的 Object 则会抛出UnsatisfiedDependencyException异常。 constructor  : 和 byType 差不多吧,只是查找的对象要赋值给构造器的参数。如果对象工厂中没有或不只一个与参数类型相同的对象定义,会抛出致命异常。查找与自动装配的 Object 的构造参数一致的一个或多个 Object 。 如果存在不确定的 Object 或是构造参数,将会抛出一个异常。 autodetect  : 根据对象自身的配置信息来自动确定是使用 constructor 还是 byType 模式。如果发现对象具有默认构造器,则使用 byType 模式。注意在spring.java 3.0中已经不再支持该方式。

  使用自动装配,需要设置 autowire 属性如:

  1   <?  xml version="1.0" encoding="utf-8"   ?> 
  2   <  objects   xmlns  ="http://HdhCmsTestspringframework.net"  > 
  3  
  4     <  object   id  ="dog"   type  ="CnblogLesson_4_4_2.Dog,CnblogLesson_4_4_2"  > 
  5       <  property   name  ="Name"   value  ="jeffy"  /> 
  6     </  object  > 
  7    
  8     <  object   id  ="p1"   type  ="CnblogLesson_4_4_2.Person,CnblogLesson_4_4_2"  > 
  9       <  property   name  ="Price"   value  ="1"  /> 
 10       <  property   name  ="Dog"   ref  ="dog"  /> 
 11     </  object  > 
 12    
 13     <!--  通过Name来进行自动装配  --> 
 14     <  object   id  ="p2"   type  ="CnblogLesson_4_4_2.Person,CnblogLesson_4_4_2"   autowire  ="byName"  ></  object  > 
 15    
 16     <!--  通过Type来进行自动装配  --> 
 17     <  object   id  ="p3"   type  ="CnblogLesson_4_4_2.Person,CnblogLesson_4_4_2"   autowire  ="byType"  ></  object  > 
 18  
 19   </  objects  > 

  看一下 Program.cs 类的代码:

  1   using   System;
   2   using   Spring.Context;
   3   using   Spring.Context.Support;
   4  
  5   namespace   CnblogLesson_4_4_2
   6   {
   7       class   Program
   8       {
   9           static   void  Main( string  [] args)
  10           {
  11               //  通过IApplicationContext来配置 
 12              IApplicationContext context =  ContextRegistry.GetContext();
  13  
 14              Dog dog = context.GetObject( "  dog  " )  as   Dog;
  15  
 16              Person p1 = context.GetObject( "  p1  " )  as   Person;
  17  
 18              Person p2 = context.GetObject( "  p2  " )  as   Person;
  19  
 20              Person p3 = context.GetObject( "  p3  " )  as   Person;
  21  
 22  
 23               Console.ReadKey();
  24           }
  25       }
  26  }

  通过监视变量来看,p3 通过 autowire="byType" 自动将 Dog对象 装配到p3的属性中

  通过自动装配的机制,从表面上来看,配置文件简洁了许多。但是,自动装配并不是十全十美的,我们不论是使用 byName 还是 byType 的方法,Spring不一定就能很准确的找到我们要的对象。另外,如果使用自动装配,配置文件的可读性也大大降低,我们不能很容易的看出个各个 Object 之间的依赖关系,这也在一定程度上降低了程序可维护性。从另一个角度来看,自动装配隐藏了很多细节,不利于程序员控制。因此在使用自动装配时要权衡利弊。

示例代码 :  http://download.csdn.net/detail/cilence6788/5093277

 

 

分类:  循序渐进之Spring.Net框架

标签:  循序渐进之Spring.Net框架

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Spring.Net 如何管理您的类___对象的自动装配的详细内容...

  阅读:40次