Spring学习笔记(一)----IoC之DI

来源:互联网 发布:区域软件 编辑:程序博客网 时间:2024/04/30 05:40
 Spring的一个核心概念就是IoC,所谓IoC,即Inversion Of Control,中文译为控制反转。其核心思想即高层模块要依赖于抽象,而不是依赖于底层模块,换句话说,也就是实现必需依赖于抽象,而不是抽象依赖于实现。

    这里所说的高层模块是指与业务相联系的模块。而低层模块是指与底层实现相联系的模块,如数据库操作模块,硬件相关的模块等。

看下面一个例子:




业务模块Business直接调用了实现模块的方法,也即高层模块与底层模块产生了依赖关系。当业务发生变更时,例如需要使用sql server了,这时我们不得不去修改Business的代码。过了两天,客户又要使用Oracle了,这时程序员就该骂人了,呵呵。
    下面就来用IoC的方法来改造这个应用:


通常所说的高层依赖于抽象,我们一般是把低层的应用抽象成接口,低层实现接口,高层依赖于接口。这样,需求变更时,只需创建不同的实现即可。
    如果A依赖于B,那么B即具有控制权,如果B是具体实现,这是我们不愿看到的,所以要转移这种依赖关系,将控制权转移到抽象的方法,让抽象的方法具有控制权。
    实际上,IoC的实现有两种方式(参见Martin Fowler的文章http://www.martinfowler.com/articles/injection.html),即Dependency Injection 与Service Locator,Spring采用的是前者,中文译为依赖注入(DI)。
    DI的实现方式有三种:Interface injection(Type 1 IoC),Setter injection(Type 2 IoC), 和 Constructor injection(Type 3 IoC)。
    Spring鼓励使用Type 2的DI方式,因为Setter有明确的方法名称可以用来了解注入对象的作用或类型,使用setXXX()这样的方法在语义上也要比另外两种方法好得多。
下面是使用了Type 2的Business类:
public class Business{
    private DBManage dbManage;
 
    public void setDbManage(DBManage dbManage){
        this.dbManage = dbManage;
    }
 
    ......
 
    publilc doBusinesss(Message message){
        dbManage.save(message);
    }
   
    ......
}
    不要担心DBManage的注入,Spring容器会处理这些事情。程序员做的只需是配置文件的设定(xml或properties文件),让Sping在执行时期根据配置文件的设定,建立对象之间的依赖关系

0 0
原创粉丝点击