Spring.Net——理解控制反转和依赖倒置

一,控制反转(Inversion of Control,缩写IoC)和依赖注入(Dependency Injection,简称DI)

       1,控制反转

                        IoC(Inversion of Control),这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关 系。

        以前,我们是这样创建对象的:

    

  /*
            //普通调用
            IPersonDAO persondao=new PersonDAO();
            persondao.Save();
            */

            /*
            //工厂方式调用
            IPersonDAO persondao = DataAccess.CreatePersonDAO();
            persondao.Save();
            */

    

     先说第一种直接new的方式,这种方式将对象的创建过程暴露出来,接下来,我们意识到这种问题之后,或许会将这个对象的创建过程封装成一个方法来调用,这样屏蔽掉了对象的创建细节,这对于创建复杂对象是有极大好处的。

      但是这两种方式都是由对象来负责对象的创建的,当然,创建完了之后,还要由我们手动维护它的生命周期和它与其他类直接的引用关系等。如果有这么一种方式,一,可以替我避免掉复杂对象的创建过程,使我免受各种参数的困扰;二,替我维护对象的生命周期和它在系统中的关系;我要做的只是在我需要这个类的时候它出现,我不需要它的时候也不用担心它。

     于是,容器这种东西出现了,spring不过是实现容器思想的一种东西。

     这时候,对象的创建,销毁,处理各种引用关系都交给spring来处理。所有的类都会在spring容器中登记,告诉spring这是个什 么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把对象交给其他需要它的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象 都被spring控制,所以这叫控制反转。

   2,依赖注入

                IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统 运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。 --来自百度

       其实想想注入原理,无论.Net还是Java,都是反射。反射从表面上看是根据一个字符创建什么东西,这个东西可以是程序集,类,属性,方法。。。反射带来的好处就是动态性,在复杂的运行环境下,我不知道系统运行到某个时刻需要一个什么东西,这时候,我们就可以运用反射来实现动态的创建过程,与反射带来的灵活性相比,我们几乎可以忽略掉它带来的性能问题。

二,spring.Net 实现对象的创建

         首先来看下我们的Demo结构:

        

          为了在console中使用sping,需加入加入spring的引用:

              

     接口类:

        

namespace DemoOne
{
    public interface IPersonDAO
    {
        /// <summary>
        /// Saves this instance.
        /// </summary>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-12 20:45:25</remarks>
        void Save();

    }
}

   实现类:

namespace DemoOne
{
   public class PersonDAO:IPersonDAO
    {

        /// <summary>
        /// Saves this instance.
        /// </summary>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-12 20:45:20</remarks>
        public void Save()
        {
            Console.WriteLine("啦啦啦啦啦啦。。。。。。。保存啦。。");
        }
    }
}

       

              接下来简单说下常见的两种配置文件+XML怎么配置spring:

              1,单独建立一个xml文件,里面保存了spring要管理的类的信息,如上objects.xml:

       

<?xml version="1.0" encoding="utf-8" ?>
<objects >
	<description></description>
	<object id="PersonDAO" type="DemoOne.PersonDAO,DemoOne"/> <!-- 配置要生成的类-->
</objects>

                  然后是应用程序配置文件:

            

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

	<!--配置处理节点的处理类-->
	<configSections>
		<sectionGroup name="spring">
			<section name="context" type="Spring.Context.Support.ContextHandler,Spring.Core"/>
			<section name ="objects" type="Spring.Context.Support.DefaultSectionHandler,Spring.Core"/>
		</sectionGroup>
	</configSections>

	<!-- spring配置-->
	<spring>

		<!--配置方式一:使用外部xml文件作为对象配置,注意:外部XML要复制到生成路径-->
		<context>
			<resource uri="file://objects.xml"></resource>
		</context>

	</spring>

</configuration>

         简单调用代码:

            

//使用了spring
            IApplicationContext iac = ContextRegistry.GetContext();
            IPersonDAO dao = iac.GetObject("PersonDAO") as IPersonDAO;

            if (dao!=null)
            {
                dao.Save();

                Console.WriteLine("spring测试成功");
                Console.ReadKey();

            }

    当然,我们也可以将类的配置信息全部写在configuration里面,不使用外部xml:

   

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

	<!--配置处理节点的处理类-->
	<configSections>
		<sectionGroup name="spring">
			<section name="context" type="Spring.Context.Support.ContextHandler,Spring.Core"/>
			<section name ="objects" type="Spring.Context.Support.DefaultSectionHandler,Spring.Core"/>
		</sectionGroup>
	</configSections>

	<!-- spring配置-->
	<spring>

		<!--配置方式二:将所有配置保存在应用程序配置文件中-->
		<context>
			<resource uri="config://spring/objects"></resource>
		</context>
		<objects>
			<object id="PersonDAO" type="DemoOne.PersonDAO,DemoOne"/> <!-- 配置要生成的类-->
		</objects>
	</spring>

</configuration>

    另外,也可以使用编程方式,直接加载xml方式,或者是xml跟config混合使用方式配置spring。

 

 

                      

时间: 2024-09-20 16:57:46

Spring.Net——理解控制反转和依赖倒置的相关文章

实例讲解Java的Spring框架中的控制反转和依赖注入_java

近来总是接触到 IoC(Inversion of Control,控制反转).DI(Dependency Injection,依赖注入)等编程原则或者模式,而这些是著名 Java 框架 Spring.Struts 等的核心所在.针对此查了 Wikipedia 中各个条目,并从图书馆借来相关书籍,阅读后有些理解,现结合书中的讲解以及自己的加工整理如下:   eg1问题描述: 开发一个能够按照不同要求生成Excel或 PDF 格式的报表的系统,例如日报表.月报表等等.   解决方案: 根据"面向接口

Spring的控制反转和依赖注入

Spring的官网:https://spring.io/  Struts与Hibernate可以做什么事? Struts, Mvc中控制层解决方案 可以进行请求数据自动封装.类型转换.文件上传.效验- Hibernate, 持久层的解决方案: 可以做到, 把对象保存到数据库, 从数据库中取出的是对象. 传统的开发模式 基于mvc模式进行项目开发: 基于mvc的项目框架结构: Entity / dao / service / action 为什么引入Spring:  思考:     1. 对象创建

Laravel 深入理解控制反转(IoC)和依赖注入(DI)

容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或者是提供对象的回调,通过这种容器,我们得以实现许多高级的功能,其中最常提到的,就是 "解耦" ."依赖注入(DI)".本文就从这里开始. IoC 容器 -- Laravel 的核心 Laravel 的核心就是一个 IoC 容器,根据文档,称其为"服务容器&qu

设计模式——控制反转&amp;amp;依赖注入

一.控制反转: 从简单的代码示例入手: /// <summary> /// 邮件服务类 /// </summary> public class EmailService { public string SendMessage() { return "发送通知邮件"; } } /// <summary> /// 邮件通知类 /// </summary> public class NotifycationSystem { private Em

体验.net2.0的优雅(4) Provider、策略、控制反转和依赖注入

在 ASP.net 2.0 的配置文件中,经常看到 Provider的影子,比如说StarterKit 中的XmlSiteMapProvider以及使用Login Controls时隐含的SqlMembershipProvider.如此众多的Provider,我猜测它们肯定有共同的父亲!查阅了一下资料,果然不出我所料,它们的父亲是 ProviderBase. [图中的 三个点 代表直接父类的名称] 我们以Membership为例,来看一下这么多的Provider是怎么被系统所使用的,以及使用它们

理解php依赖注入和控制反转_php技巧

要想理解php依赖注入和控制反转两个概念,就必须搞清楚如下的问题:  DI--Dependency Injection   依赖注入 IoC--Inversion of Control  控制反转 1.参与者都有谁? 答:一般有三方参与者,一个是某个对象:一个是IoC/DI的容器:另一个是某个对象的外部资源.又要名词解释一下,某个对象指的就是任意的.普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序:对象的外部资源指的就是对象需要的,但是是从对象外部获取

控制反转(IoC)与依赖注入(DI)

1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理.所谓的"控制反转"概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器. IoC是一个很大的概念,可以用不同的方式来实现.其主要实现方式有两种:<1>依赖查找(Dependency Lookup):容器提

Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

原文地址:http://blog.csdn.net/wangyang1354/article/details/50757098 我们经常会遇到这样一种情景,就是在我们开发项目的时候经常会在一个类中调用其他的类中的方法,来完成我们期望的任务,大部分的情况下往往会采用在当前需要的这个类里面new一个实例出来,然后调用他的方法,那么这样的话会有个问题,就是有一天我想改变下这个类,改为其他的名称,那么这时候必须要做的是同时去调用方的类文件中改变这个改变的类的名称.这样的情况是因为代码的耦合带来了后期维护

Spring控制反转/依赖注入

问题描述 什么是控制反转?控制反转(IoC=InversionofControl)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控.这也就是所谓"控制反转"的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转.什么是依赖注入?所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中.依赖注入的好处:依赖注入机制减轻了组件之间的依赖关系,同时也大大提高了组件的可移植性