在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC)。

  控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IoC框架来管理这些对象,使得依赖脱离类本身的控制,从而实现松耦合。

我们先来看一段代码

  1. namespace Dao
  2. {
  3.     public interface IPersonDao
  4.     {
  5.         void Save();
  6.     }
  7.  
  8.     public class PersonDao : IPersonDao
  9.     {
  10.         public void Save()
  11.         {
  12.             Console.WriteLine("保存 Person");
  13.         }
  14.     }
  15. }
  16.  
  17. namespace SpringNetIoC
  18. {
  19.     class Program
  20.     {
  21.         private static void NormalMethod()
  22.         {
  23.             IPersonDao dao = new PersonDao();
  24.             dao.Save();
  25.             Console.WriteLine("我是一般方法");
  26.         }
  27.     }
  28. }

Program必然需要知道IPersonDao接口和PersonDao类。为了不暴露具体实现,我可以运用设计模式中的抽象工厂模式(Abstract Factory)来解决。

  1.  
  2. namespace DaoFactory
  3. {
  4.     public static class DataAccess
  5.     {
  6.         public static IPersonDao CreatePersonDao()
  7.         {
  8.             return new PersonDao();
  9.         }
  10.     }
  11. }
  1. namespace SpringNetIoC
  2. {
  3.     class Program
  4.     {        private static void FactoryMethod()
  5.         {
  6.             IPersonDao dao = DataAccess.CreatePersonDao();
  7.             dao.Save();
  8.             Console.WriteLine("我是工厂方法");
  9.         }
  10.     }
  11. }

这时,Program只需要知道IPersonDao接口和工厂,而不需要知道PersonDao类。然后我们试图想象,要是有这样的工厂框架帮我们管理依赖的对象就好了,于是控制反转出来了。

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.  
  4.   <configSections>
  5.     <sectionGroup name="spring">
  6.       <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
  7.       <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
  8.     </sectionGroup>
  9.   </configSections>
  10.  
  11.   <spring>
  12.  
  13.     <context>
  14.       <resource uri="config://spring/objects" />
  15.     </context>
  16.  
  17.     <objects xmlns="http://www.springframework.net">
  18.       <description>一个简单的控制反转例子</description>
  19.  
  20.       <object id="PersonDao" type="Dao.PersonDao, Dao" />
  21.  
  22.     </objects>
  23.  
  24.   </spring>
  25.  
  26. </configuration>
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Dao;
  6. using DaoFactory;
  7. using Spring.Context;
  8. using Spring.Context.Support;
  9.  
  10. namespace SpringNetIoC
  11. {
  12.     class Program
  13.     {
  14.         static void Main(string[] args)
  15.         {
  16.             //NormalMethod();  // 一般方法
  17.             //FactoryMethod();  // 工厂方法
  18.             IoCMethod();  // IoC方法"
  19.  
  20.             Console.ReadLine();
  21.         }
  22.  
  23.         private static void NormalMethod()
  24.         {
  25.             IPersonDao dao = new PersonDao();
  26.             dao.Save();
  27.             Console.WriteLine("我是一般方法");
  28.         }
  29.  
  30.         private static void FactoryMethod()
  31.         {
  32.             IPersonDao dao = DataAccess.CreatePersonDao();
  33.             dao.Save();
  34.             Console.WriteLine("我是工厂方法");
  35.         }
  36.  
  37.         private static void IoCMethod()
  38.         {
  39.             IApplicationContext ctx = ContextRegistry.GetContext();
  40.             IPersonDao dao = ctx.GetObject("PersonDao") as IPersonDao;
  41.             if (dao != null)
  42.             {
  43.                 dao.Save();
  44.                 Console.WriteLine("我是IoC方法");
  45.             }
  46.         }
  47.     }
  48. }

一个简单的控制反转程序例子就实现了。

这样从一定程度上解决了Program与PersonDao耦合的问题,但是实际上并没有完全解决耦合,只是把耦合放到了XML
文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中。我个人认为可以把IoC模式看做是工厂模式的升华,可以把
IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的。

Spring.NET学习笔记1——控制反转(基础篇)的更多相关文章

  1. Spring学习笔记——01 控制反转

    想一下之前学的Java,如果某个类需要引用某个对象,则需要手动new一个出来.这样带来的一个问题就是,若被引用的类发生改动或被删除,则引用它的所有类都会报错.因为两个类耦合在一起了.解决的办法就是不由 ...

  2. Spring.NET学习笔记6——依赖注入(应用篇)

    1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...

  3. 嵌入式Linux学习笔记之第一阶段---基础篇

    嵌入式Linux学习分五个阶段 第一阶段: 01嵌入式环境搭建初期 02C语言语法概述 03C语言内存操作 04c语言函数 05linux基础 06gun基础 第二阶段: 01-linux之io系统编 ...

  4. Spring Security 学习笔记-授权控制过滤器

    FilterSecurityInterceptor  是比较核心的过滤器,主要负责授权工作.SecurityMetadataSource 需要安全授权的元数据资源 AuthenticationMana ...

  5. python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建         不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上 ...

  6. python学习笔记三 函数(基础篇)

    函数 内置函数 常用的内建函数: type()  列出指定对象的类型 help()  能够提供详细的帮助信息 dir()    将对象的所有特性列出 vars()  列出当前模块的所有变量 file, ...

  7. MongoDB 学习笔记(一)基础篇

    1.MongoDB 特点 面向集合存储,存储对象类型的数据方便 模式自由,不需要定义任何模式(schma) 动态查询 完全索引,包含内部对象 复制和故障恢复方便 高效的二进制数据存储 支持c# 平台驱 ...

  8. 【JQuery学习笔记】一、基础篇

    Lesson2 Ready 和onload类似,但onload只能注册一次,后注册的取代现注册的,而Ready可以多次注册都会执行 onload是所有院所创建完毕.图片.Css等都加载完毕后才触发,而 ...

  9. python爬虫学习笔记(二)——基础篇之爬虫基本原理

    1.什么是爬虫? 请求网站并提取数据的自动化程序 2.爬虫基本流程 2.1发起请求 通过HTTP库向目标站点发起请求,即发起一个Request,请求可以包含额外的headers等信息,等待服务器响应: ...

随机推荐

  1. HDU 1045 dfs

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. 爬虫服务集群处理nginx返回504

    最近在对爬虫服务做分布式服务的时候总是遇到服务器返回504,搞了两天才发现原来是nginx中有对超时的设置参数,自己都是用默认的,然而客户端的等待时间超过了nginx默认的超时设置 修改 keepal ...

  3. 如何生成Java Key以及sign一个jar

    1. 生成Java Key: keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize mydomain ...

  4. Chrome切换分辨率

    不知道大家是否有遇到在Web开发的时候,老大会让你模拟不同分辨率情况,这时候,可能就有些小小的麻烦,我们可能要不断调整分辨率.是件很崩溃的事情.现在推荐一款Chrome插件.即可实现这个简单的功能. ...

  5. 验证组件——FluentValidation

          FluentValidation FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开 ...

  6. Mysql优化小记1

    在项目开发中,需要写个windows服务从sqlserver复制数据到mysql(5.6.13 Win64(x86_64)),然后对这些数据进行计算分析.每15分钟复制一次,每次复制大概200条数据, ...

  7. PHP正则 贪婪匹配与非贪婪匹配

    $str = ".abcdeabcde"; preg_match('/a.+?e/', $str, $match); print_r($match); Array ( [0] =& ...

  8. Atlantis(POJ1151+线段树+扫描线)

    题目链接:http://poj.org/problem?id=1151 题目: 题意:求所有矩形的面积,重合部分只算一次. 思路:扫描线入门题,推荐几篇学扫描线的博客: 1.http://www.cn ...

  9. JSP九大内置对象,七大动作,三大指令

    JSP之九大内置对象 隐藏对象入门探索 Servlet 和JSP中输出数据都需要使用out对象.Servlet 中的out对象是通过getWriter()方法获取的.而JSP中没有定义out对象却可以 ...

  10. 命令行创建KVM虚拟机

    qemu命令创建虚拟机: qemu-img create -f qcow2 /home/ubuntu.img 20G   qemu-system-x86_64 -m 2048 -enable-kvm ...