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-08-09 22:01:00

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

Spring框架之控制反转和依赖注入

学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权的转移: 就叫做控制反转. 第一步:配置applicationContextcreateproject.xml和applicationcontext.xml(总体) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=

轻松了解Spring中的控制反转和依赖注入(二)

紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类之间的结构图如下 以下是代码 BeanFactor接口:在Spring源码中的定义是:持有对一定数量的Bean的定义,同时每个Bean都被唯一标识的对象(类),需要实现这个接口.根据对Bean的定义,该工厂将会返回一个包含Bean定义的对象的独立实例(原型设计模式),或者单例共享(一个不错的单例设计模式,)范

轻松了解Spring中的控制反转和依赖注入

我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级JavaBean(Enterprise JavaBean ,EJB)在创建之初是非常成功,但是时间一久人们便开始追逐更加方便更加简易和轻量级的技术框架实现,于是Spring就应运而生,并且Sring一直开始不断地涉及到其他领域(这里就不再多详谈了),而Spring的精髓当中就包括控制反转和依赖注入. 浅

2018/04/01 理解控制反转和依赖注入

首先,控制反转和依赖注入不是一种编码,是一种设计的思想.实现的方式也有很多. 控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法. 具体的概念也不多赘述,网上一搜一大片对于这方面的知识的讲解,这里只说一下我对它的理解. -- 先刨除这个概念,单单思考一个问题,如果你需要连接一个Mysql数据库,你需要怎么做? 以下均为伪代码 function __construct() { // 连接Mysql数据库 } -- 这也没什么问题,对吧. 假如我们换一个 mariadb 数据库呢?

Spring之ioc控制反转(依赖注入)

个人感觉依赖注入比控制反转更好理解,所以下面就只说依赖注入: spring的整体结构示意图: 一.spring 中的概念 beanFactory容器 1.容器是spring框架的核心,容器使用ioc依赖注入来管理所有组成应用系统的组件. 2.spring中的两种容器: beanFactory  这个容器提供了基础的依赖注入支持,而且是延迟加载的,而 applicationcontext是对beanFactory 这个容器的扩展, 3.beanFactory :beanFactory就是一个Bea

浅谈spring框架的控制反转和依赖注入

spring是什么? spring是一个轻量级的控制反转和面向切面编程的开源容器框架. 轻量级是说spring框架本身的体积小. 控制反转(Ioc):它不是技术,而是一种思想,将创建对象的控制权力交给spring框架. 依赖注入(DI):将对象中的属性通过配置文件的方式进行赋值. 面向切面编程(AOP):零散存在于业务层中的功能代码(例如:日志,事务),称为横切面关注点.把一个个横切面关注点放到某个模块中,称为切面. AOP就是把多个方法前后的共同代码抽离出来,使用动态代理机制来控制.好处是降低

架构设计之依赖倒置、控制反转与依赖注入

名词解释 依赖:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A依赖于类B. 耦合:一种模型元素之间的关系的描述.例如类A调用了类B或类B调用了类A,那么我们说类A与类B有耦合关系. 耦合度:模型元素之间的依赖程度的量化描述. 控制:一种模型元素之间的关系的描述.例如类A调用了类B,那么我们说类A控制类B. 绪论 架构设计的对象一般是类库.框架和应用程序.其工作任务除了类库.框架.应用程序各个模块(类)之间的关系设计之外,还包括类库.框架和应用程序三者之间关系的设计.而依赖倒置.

spring(3)------控制反转(IOC)/依赖注入(DI)

一,spring核心概念理解 控制反转: 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理. 所谓的"控制反转"概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器. 没有控制反转这种模式前,你创建一个对象,在什么地方用,你得单独通过关键字new出来用, 但现在可以不用这样,你把new对象的权利交给spring配置文件,通过配置文件来'new', 就是权利的反转,你以前干的事

spring学习总结一----控制反转与依赖注入

spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转(依赖注入)进行简单的总结. 一.控制反转与依赖注入的概念 在学习spring框架的时候,我们习惯性地将控制反转和依赖注入放在一起,其实,两者体现的思想原则都是差不多的,只不过控制反转是一种更广泛的程序操作理念,而依赖注入是一种更为具体的实现方法,总的来说,控制反转可以依靠依赖注入来实现. 1.控制