`
thelongestday
  • 浏览: 34609 次
  • 性别: 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  
简单的例子,道出了问题的本质,不错

相关推荐

    《Spring IOC核心技术》- 冰河原创电子书

    《Spring IOC核心技术》是冰河原创的一本专注于Spring IOC核心概念和技术的电子书。Spring作为Java开发领域的重要框架,它的依赖注入(IOC)机制是其核心功能之一,它极大地简化了对象之间的耦合,提高了代码的灵活...

    美河原创作品]J2EE系列讲座

    1. **Spring框架基础**:介绍Spring框架的基本概念,包括IoC容器和依赖注入,以及Bean的生命周期管理。 2. **AOP**:解释什么是面向切面编程,如何在Spring中定义切面,创建通知(advises),并将其应用于目标方法...

    spring aop 经典例子(原创)

    在这个经典例子中,我们将深入理解Spring AOP的核心概念,并通过实际操作来加深印象。 首先,AOP的核心是切面(Aspect),它封装了横切关注点,如日志记录、事务管理等。在Spring AOP中,切面通常由一个或多个通知...

    unityStrangeIoc

    我的理解就是,原本A类要获取B类的对象,需要你在A类中自己New一个对象,那么是由A来获取并控制B的对象,IOC就是把对象获取的这个过程交给容器和依赖注入来处理,A类并不知道B的对象是哪里来的,对B对象的控制,由...

    让Spring之父Rod Johnson拍案叫绝的原创经典(spring解密)

    2. **依赖注入**:Spring的核心特性之一就是依赖注入,它通过反转控制(Inversion of Control,IoC)实现。DI允许开发者在运行时动态地将对象和服务组合在一起,减少了对象之间的耦合度。 3. **AOP(面向切面编程)...

    安卓原创教材

    - **精通安卓体系架构**: 包括MVC模型视图控制器模式、常见的设计模式以及控制反转(IoC)等概念。 - **编写高质量的代码**: 确保代码具有可重用性、可扩展性、易于维护并且具备良好的灵活性。 - **高效编写高效的代码...

    高级架构师培训知识点总结(原创)

    #### 五、面向对象的基本概念 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,其核心思想是将数据和操作数据的方法封装在一起,形成对象。通过这种方式,可以更好地模拟现实世界中的事物,提高...

    电力电子课程网站

    1. **Struts2框架**:学习Struts2的Action、Result、Interceptor等核心概念,以及如何通过配置文件或注解来定义动作和结果,理解MVC设计模式的应用。 2. **iBatis框架**:了解XML配置文件或注解方式的SQL映射,学习...

    梦之都辛星Spring4.x参考资料

    - IoC(控制反转)和DI(依赖注入):IoC是Spring框架的基础,它通过控制反转的方式管理对象的创建和依赖关系,而DI是实现IoC的具体手段。 - AOP(面向切面编程):允许开发者定义跨多个点的方法拦截器(或称为...

    辛星 JDBC、MyBatis、Spring、Yaf、LESS、Symfony、Markdown、SQLite、Codeigniter 教程 2016

    Spring4.x教程将深入讲解Spring的核心概念,如IoC容器、AOP、MVC框架和数据访问集成。 4. **Yaf (Yet Another Fast Framework)**:Yaf是PHP开发的一款高性能、轻量级的MVC框架。它专注于提升Web应用的性能,减少...

Global site tag (gtag.js) - Google Analytics