`
thelongestday
  • 浏览: 34204 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

理解IoC的概念(原创)

阅读更多
IoC全称为Inversion of Control,直译为控制反转。
在传统的应用程序中,控制权在应用程序本身,程序的控制流程完全由开发者控制。在IoC模式下,控制权发生了反转:从应用程序转移到了IoC容器。组件不再由应用程序负责创建和配置,而是由IoC容器负责,应用程序只需要真接使用已经创建并配置好的组件。为了让组件能在IoC容器中被“装配”出来,需要某种“注入”的机制,才能将一种组件“注入”到另一种组件中。
简单来说,依赖注入解决了最主要的问题:将组件的配置与使用相分离,并且由IoC宣传品负责管理组件的生命周期。

一个全面说明IoC功能的例子:
有一个BookService组件如下:
public class BookService{
	private BookDao bookDao=new DbBookDao();
	//根据提供的作者名,列出该作者编写的书籍
	public List<Book> listBookByAuthor(String author){
		//列出所有书籍
		List<Book> book=bookDao.listAll();
		Iterator<Book> it=books.iterator();
		while(it.hasNext()){
			if(!it.next().getAuthor().equals(author))
				it.remove();
		}
		return books;
	}
}
*以上代码实现的功能很简单,即列出指定作者的书籍。而列出所有书籍的功能被委托给bookDao对象。考虑到书籍可能存储的多种形式,如数据库、XML文件等,将BookDao声明为接口,并在某个子类中实现具体的功能符合面向对象编程的基本原则之一:针对抽象编程。因此,我们实现了一个具体的子类DbBookDao。
*上例中,BookService通过在其内部实例化一个DbBookDao类的对象bookDao,来持有该类的对象。这样的方式有如下缺点:
1,如果需要BookDao的另一种实现,比如改为对应某个其它的数据库系统。就必须重新实现一个BookDao接口的实例,如MsSqlDbBookDao。这样就需要改动bookService中的代码(下划线部分)。
2,BookDao的实例定义在BookService组件中,其他需要引用BookDao的组件很难共享。
以上两个问题会导致系统的复杂性增大、组件之间的耦合度过于紧密。从而使测试和维护的困难极大。

上面所有问题的实质是:如何组装大量的组件,使之互相配合完成复杂的系统功能?采用上面的方法显然是不行的。解决这个问题的一个方案是使用IoC。
在Java中,使用set方法可以非常简单地实现这一注入机制。可以将BookService修改如下:
public class BookService{
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao){
		this.bookDao=bookDao;
	}
	//根据提供的作者名,列出该作者编写的书籍
	public List<Book> listBookByAuthor(String author){
		//列出所有书籍
		List<Book> book=bookDao.listAll();
		Iterator<Book> it=books.iterator();
		while(it.hasNext()){
			if(!it.next().getAuthor().equals(author))
				it.remove();
		}
		return books;
	}
}
*bookDao实例不再由BookService创建,而是由IoC容器负责将某个BookDao实例通过setBookDao()方法注入。

由于IoC容器负责实例化所有的组件,因此,需要告诉容器如何创建组件和各组件之间的依赖关系。最常见的配置方式是通过一个XML文件。
<beans>
    <bean id="bookDao" class="DbBookDao">
    <bean id="bookService" class="BookSerivce">
        <property name="bookDao" ref="bookDao" />
    </bean>
</beans>
*配置bookService组件时,ref指向的就是bookDao组件,Spring的IoC容器就根据该配置自动调用bookService的setBookDao()方法,将bookDao组件注入到bookService组件中去。










分享到:
评论
1 楼 fh119609336 2012-10-02  
简单的例子,道出了问题的本质,不错

相关推荐

    IOC(DI)与AOP概念的理解

    "IOC(DI)与AOP概念的理解" IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是软件设计中两个重要的概念。控制反转的意思是依赖关系的获取方式被反转了。所谓依赖,从程序的角度看,...

    IOC详解IOC详解IOC详解IOC详解

    4. **可管理性**:通过集中式的配置文件,可以统一管理和控制所有对象的生命周期,使得系统更加易于理解和维护。 5. **面向接口编程**:IoC鼓励面向接口编程,而不是面向具体实现。这符合依赖倒转原则(Dependency ...

    Spring的Hello World:理解IoC

    本文将通过"Spring的Hello World:理解IoC"这一主题,深入探讨Spring框架中的依赖注入(Dependency Injection,简称DI)概念,也被称为控制反转(Inversion of Control,简称IoC)。 首先,我们需要明白什么是IoC。...

    IOC之深入理解SpringIoC

    理解好它的关键在于我们需要回答如下四个问题:谁控制谁控制什么为何是反转哪些方面反转了在回答这四个问题之前,我们先看IOC的定义:所谓IOC,就是由SpringIOC容器来负责对象的生命周期和对象之间的关系上面这句话...

    自己实现ioc实例demo

    总的来说,这个“自己实现ioc实例demo”旨在帮助开发者理解依赖注入的基本概念,并通过XPath解析XML文件实践这一过程。通过这个练习,你可以深入学习XML解析技术,掌握如何使用XPath选取信息,以及如何通过反射实现...

    springIoc实现原理

    **一、控制反转(IoC)概念** 控制反转是一种设计思想,主要体现在对象的创建和依赖关系的处理上。在IoC中,不再由对象自己去创建或查找依赖的对象,而是将这种控制权交给一个专门的容器(即Spring Ioc容器)。这样...

    IOC练习事列

    这个“IOC练习事例”旨在帮助我们深入理解IOC和DI的概念,通过实现`MyselfIoc`容器,我们可以学习如何管理和解决对象的依赖关系,提高代码的灵活性和可测试性。通过接口编程和依赖注入,我们可以编写出更符合SOLID...

    IOC和AOP深刻理解基础代码测试

    在Java Web开发中,IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)是两个至关重要的概念,它们极大地提升了代码的灵活性和可维护性。Spring框架是实现这两种设计模式的...

    IOC的原理以及自定义使用

    **IOC(Inversion of Control)**,即控制反转,是软件设计模式中的一种核心概念,主要应用于依赖注入(Dependency Injection,DI)。...通过自定义IOC的实现,可以更深入地理解和运用这一概念,为日常开发带来便利。

    spring ioc

    首先,理解 IOC 的概念至关重要。IOC 是一种设计模式,它将对象的创建和管理权反转,由框架负责管理对象的生命周期,而不是由对象自身管理。这样,开发者可以更专注于业务逻辑,而无需关心对象的实例化、配置和组装...

    IOC容器_原理代码

    **IOC容器原理与实现** IOC(Inversion of Control),即控制反转,是软件设计模式中的一种核心概念。在Java开发中,Spring框架是最为著名的实现IOC的库。...通过实践代码`iocDemo`,我们可以更深入地理解这些概念。

    Spring中IoC优点与缺点解析

    Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...

    简单IOC容器demo

    【标题】:“简单IOC容器demo”是一个演示性的项目,它旨在教授如何构建一个基础的控制反转(IOC)容器...这将有助于理解Spring框架中IOC和依赖注入的基本概念,对于想要深入学习Spring框架的人来说是很有价值的起点。

    自己的IoC框架实现

    首先,理解IoC的概念至关重要。IoC是指应用程序的控制权由传统的方式(如:对象直接创建和管理依赖关系)转移到框架或容器中,这样对象不再负责管理它们的依赖,而是由外部容器动态地注入。这种方式使得对象之间解耦...

    Spring-IOC实现

    1. **控制反转(IOC)概念** - 控制反转是设计模式中的一个概念,它改变了传统的对象获取方式。在没有IOC的情况下,对象通常自行创建依赖。而在IOC中,这些依赖由外部容器(如Spring)提供,从而降低了代码间的耦合...

    最新的ioc代码例子

    通过创建Java工程,设置源代码和库目录,以及编写配置文件或Java配置类,我们可以理解并实践IoC的核心概念。这将有助于提升开发者对Java应用程序设计模式的理解,以及如何利用Spring框架来优化代码结构。

    经典ioc图标集合包

    这些图标可能被用于表示依赖注入、服务定位器、容器管理等IoC概念,是开发者和设计师们在创建工具栏、菜单、图形用户界面时的宝贵素材。 【描述】:“经典ioc图标集合包,N个包打包到一起的,绝对比那个要5分资源值...

    10-IoC配置-依赖注入概念(DI)

    我相信很多朋友学习IOC概念的时候,查找了很多资料结果还是一头雾水,感觉高深难懂或者一知半解,而我这篇博客就是以通俗易懂的话语,用故事的方式,讲解IOC(控制反转)和DI(依赖注入)的概念,让大家不再晕,不再觉得...

    精美的IOC图标,对于开发有很大的好参考价值

    而"IOC图标"在这里可能是指用于表示或与IOC相关的图形标识,它们可能是为了帮助开发者更好地理解和视觉化IOC的概念。 IOC图标通常简洁明了,可能包含箭头、手掌、控制台等元素,来表达控制权从代码内部转向外部容器...

Global site tag (gtag.js) - Google Analytics