java 控制反转Ioc和依赖注入DI,面向切面-AOP

依赖和耦合(Dependency and Coupling)

依赖:依赖描述了两个模型元素之间的关系,如果被依赖的模型元素发生变化就会影响到另一个模型元素。

简单的说,依赖就是一种需要。鱼需要水才能生存,鱼对水就有依赖关系;人需要进食才能活着,人对食物就有依赖关系。

耦合:如果改变程序的一个模块要求另一个模块同时发生变化,就认为这两个模块发生了耦合。

简单地说,耦合就是发生了依赖。和上面的例子一样,鱼和水之间发生了耦合,如果水发生了改变,会影响到鱼;人和食物之间发生了耦合,如果食物发生了改变,也会对人造成影响。

从上面的定义中可以看出,如果模块A调用模块B提供的方法,或者访问模块B中的某些数据成员(当然,在面向对象开发中一般不提倡这样做),我们就认为模块A依赖于模块B,模块A和模块B之间发生了耦合。

class Go {
    Run r = new Run(); // 对Run产生了依赖关系,即Go和Run发生了耦合关系
    void doWalk() {
        r.doRun();
    }
}

class Run {
    void doRun() {
        // do something
    }
}

Ioc

降低紧耦合场景,将控制权移交给一个“代理”进行统一处理;
控制反转从字面上来看,就是对控制权的反转。把创建对象的控制权交给第三方容器,当程序中需要用到实例对象的时候,就向第三方容器发出请求,由第三方容器返回一个实例对象。

java 控制反转Ioc和依赖注入DI,面向切面-AOP_第1张图片

DI

依赖注入(Dependency Injection,简称 DI)是实现控制反转的主要方式:在类 A 的实例创建过程中就创建了依赖的 B 对象,通过类型或名称来判断将不同的对象注入到不同的属性中;
依赖注入是控制反转的具体实现。意思就是说当程序中需要用到实例对象的时候,才去向第三方容器发出请求,由第三方容器返回实例对象(注入)。

注入三种实现方式

方法1:构造函数注入:在构造的时候,将依赖的ClassB对象作为参数传递给ClassA对象。(ClassA中有reference等着被赋值)

方法2:setter注入:通过ClassA对象的setter方法,将ClassB对象作为参数传递给ClassA对象。(ClassA中有reference等着被赋值)

方法3:定义一个接口A,ClassA类实现接口A的某个方法,将ClassB对象作为参数传递给ClassA对象。(ClassA中有reference等着被赋值)

方法2和方法3的区别还是解耦,任何类只要实现了接口A的这个方法都有依赖注入(依赖赋值)能力。

假定 Driveable为上述提到的ClassB;
Person2为ClassA;
DepedencySetter为接口A

/**
 * 接口方式注入
 * 接口的存在,表明了一种依赖配置的能力。
 */
public interface DepedencySetter {
    void set(Driveable driveable);
}
public class Person2  implements DepedencySetter {

    //接口方式注入
    @Override
    public void set(Driveable driveable) {
        this.mDriveable = mDriveable;
    }

    private Driveable mDriveable;

    //构造函数注入
    public Person2(Driveable driveable){
        this.mDriveable = driveable;
    }

    //setter 方式注入
    public void setDriveable(Driveable mDriveable) {
        this.mDriveable = mDriveable;
    }

    public void goOut(){
        System.out.println("出门啦");
        mDriveable.drive();
        //mCar.drive();
//        mTrain.drive();
    }

    public static void main(String ... args){
            //TODO:
        Person2 person = new Person2(new Car());
        person.goOut();
    }
}

AOP

你可能感兴趣的:(java,java)