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

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

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

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

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

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

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

 1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.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 之间的依赖关系,这也在一定程度上降低了程序可维护性。从另一个角度来看,自动装配隐藏了很多细节,不利于程序员控制。因此在使用自动装配时要权衡利弊。

第四章 Spring.Net 如何管理您的类___对象的自动装配的更多相关文章

  1. 第四章 Spring.Net 如何管理您的类___对象的手动装配

    前面我们知道了什么是对象,什么是对象工厂,什么是应用程序上下文.这一次我们来看一下对象的装配. Spring.Net 中有多种装配对象的方式,装配这个词可能比较学术化,我们可以理解为对象的创建. Sp ...

  2. 第四章 Spring.Net 如何管理您的类___对象、对象工厂和应用程序上下文

    在前面一章我们介绍了依赖注入,控制反转的概念,以及自己动手搭建了一下Spring.Net的环境.通过这些操作,我们知道了Spring.Net 的核心是使用依赖注入或控制反转这种思想来管理业务对象,降低 ...

  3. 第四章 Spring.Net 如何管理您的类___对象的生命周期链

    各位,实在不好意思,因为有事,博客几天没更新了.前面有童鞋提到,配置 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容.在下一章会详细介绍. 传统的Net应用中, ...

  4. 第四章 Spring.Net 如何管理您的类___对象的作用域

    Spring.Net 中对象的作用域,就是描述对象的部署模式 ,Spring.Net 中对象可以通过两种模式布署: ① singleton(单例模式) ② 非singleton 也叫非单例模式(或者叫 ...

  5. 第四章 Spring.Net 如何管理您的类___对象的初始化方式

    在 Spring.Net 中对象初始化的方式分为两种: ① 急切实例化,也就是说 Spring.Net 容器初始化的时候将对象先实例化出来. ② 延迟实例化,也就是说我们在调用 GetObject 方 ...

  6. 第四章 Spring.Net 如何管理您的类___自定义对象行为

    Spring.Net 一直讲求 ” 配置应用程序“,有一种需求在实际开发中不太常用,却非常有用 -> 配置对象的行为,Spring.Net 也能够完美的实现.Spring.Net 通过几个专门的 ...

  7. 第四章 Spring.Net 如何管理您的类___统一资源访问接口

    在前面章节有童鞋提到过 关于配置文件 Objects.xml 路径的相关问题,这些东西是 IResource 接口的一些内容,接下来就详细介绍一下 IResource 接口. IResource 接口 ...

  8. 第四章 Spring.Net 如何管理您的类___让对象了解自己的容器

    我们在开发中,经常需要让对象了解自己所在的容器的信息,例如,有时我们需要让对象知道,对象所在容器的引用是什么,或者是对象在容器中的名称是什么 .Spring.Net 中提供了两个接口,我们使用这两个接 ...

  9. 第四章 Spring.Net 如何管理您的类___IObjectPostProcessor接口

    官方取名叫 对象后处理器 (object post-processor) , 听起来很高级的样子啊!实际上就是所有实现了这个接口的类,增加了两个方法. Spring.Objects.Factory.C ...

随机推荐

  1. Java – Convert IP address to Decimal Number

    In this tutorial, we show you how to convert an IP address to its decimal equivalent in Java, and vi ...

  2. 【转】Hadoop安全实践

    前言 在2014年初,我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版, 与此同时部署了 Hadoop 的安全认证.本文主要介绍在 Hadoop 2.2.0 上部署 ...

  3. 查看JSTL的doc解决问题

    感觉JSTL这些东西的API远比java的api难找多了,不过终究是有办法的,google:jstl documentation,进入http://docs.oracle.com/javaee/5/j ...

  4. LeetCode: Word Ladder II 解题报告

    Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation s ...

  5. docker centos7 dbus error解决方法

    在centos7 上使用centos7的docker镜像结果不能使用systemd,提示 Failed to get D-Bus connection: No connection to servic ...

  6. Maven学习之(二)Maven插件创建项目

    现在这里是已经在eclipse上成功的安装了Maven的插件后的操作,简单的创建一个项目, 同时实现Maven功能. 前提条件: 1.JDK 2.maven安装好 3.eclipse上maven插件安 ...

  7. 【Unity笔记】将角色的碰撞体朝向鼠标点击方向——角色朝向鼠标

    int floorMask; // 自动寻路层 void Awake() { floorMask = LayerMask.NameToLayer("Floor"); } void ...

  8. jquery-ajax-php(内容点赞并进行cookie限制实现)

    1.模板页html例如以下: 2.模板页的jquery里的ajax实现例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T ...

  9. MVC教程一:MVC简介

    一.概述 1.MVC是一种流行的Web应用架构技术,他把Web应用划分成Model(模型).Controller(控制器)和View(视图)三部分. 2.优点:可测试.可维护 3.MVC是ASP.NE ...

  10. Hadoop集群作业调度算法

    转自:http://blog.csdn.net/chen_jp/article/details/7983076 Hadoop集群中有三种作业调度算法,分别为FIFO,公平调度算法和计算能力调度算法 先 ...