浏览 2298 次
锁定老帖子 主题:理解IoC的概念(原创)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-23
最后修改:2010-04-25
在传统的应用程序中,控制权在应用程序本身,程序的控制流程完全由开发者控制。在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组件中去。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |