对依赖注入,控制反转,反射的理解

依赖反转原则
设计模式中,为了遵循开闭原则,降低类与类之间的依赖关系,又设计了依赖反转原则:
    高层不应该依赖于低层,两者都应该依赖于抽象;
    抽象不依赖于具象,具象依赖于抽象。
理解:如一个项目中,高层的控制逻辑直接依赖于低层的数据库(sql), 直接在逻辑类中创建数据库的对象,就形成了对数据库的紧密的依赖。那么如果用户需要换数据库(access),且高层逻辑完全不变,则更换数据库时,不仅要添加扩展代码,还要修改源码。 但破坏开闭原则,不易维库不易扩展不易复用不灵活吧啦吧啦。所以应该将数据库设计个高层的抽象,即抽象类或是接口,高层依赖于抽象,根据需要从接口处创建需要的对象,低层sql和access都需要实现接口。这样添加access的时候,只需要扩展,不修改原来的代码即可。

反射:不用new来创建对象,而是用类加载器,根据字符串名创建类,创建类的权利转移了,不是调用者new而是交给了IoC(inversion of control)控制容器来创建,是实现控制反转的关键技术。在java中,用Assembly.Load(集合名).CreateInstance(集合名.类名)来实现反射,对象是由IoC容器根据类加载器创建的。对象不是预先创建编译好,而是使用时动态创建。

控制反转:利用反射技术,将对象创建权利转移给容器,一般结合配置文件,读取根据配置文件创建对象,省去了用来判断创建哪个对象的switch和if语句。

依赖注入:依赖注入也是实现控制反转的一个技术,其实我们在项目中也经常用到,即对象的实例化由别的类注入,可以是容器创建了然后注入,也可以是另外的类中创建后注入,不是自己创建,也是将控制权转自给了别人。可以用构造函数也可以用set函数,如:
public class Logic{
    myDataBase db;
    public Logic(myDataBase mdb){
        db = mdb;
    }
    或
    public void setMyDatabase(myDataBase mdb){
        db = mdb;
 }
    ......
}
参数是实例化后的对象,不是自己new的,称为依赖注入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章