1.5 控制反转和依赖注入介绍
在没有Spring框架的时候,如果在A类中使用B类,则必须在A类中new实例化出B类的对象,这就造成了A类和B类的紧耦合,A类完全依赖B类的功能实现,这样的情况就属于典型的“侵入式开发”。随着软件业务的复杂度提升,当原有的B类不能满足A类的功能实现时,就需要创建更为高级的BExt类,结果就是把所有实例化B类的代码替换成new BExt()代码,这就产生了源代码的改动,不利于软件运行的稳定性,并不符合商业软件的开发与维护流程。IoC技术就可以解决这样的问题,其办法就是使用“反射”技术,动态地对一个类中的属性进行反射赋值,对于这样的功能,Spring形成了一个模块,模块的功能非常强大,并且Spring对这种机制进行了命名,叫作控制反转(Inversion of Control,IoC)。
IoC要达到的目的就是将调用者与被调用者进行分离,让类与类之间的关系进行解耦,这是一种设计思想。解耦的原理如图1-3所示。
图1-3 使用IoC实现解耦
Spring框架中的IoC技术可以实现A类和B类的解耦,在A类中不再出现new B()的情况,实例化new B()类的任务由Spring框架来进行处理,Spring框架再使用反射的机制将B类的对象赋值给A类中的B b变量。原来A类是主动实例化B类的对象,控制方是A类,而现在以被动的方式由Spring框架来进行实现,控制方现在变成了Spring框架,实现了反转,所以此种技术称为“控制反转”。
IoC是一个理念,也是一种设计思想。A类中的B b对象的值是需要被赋值的,实现的方式是依赖注入(Dependency Injection,DI)。依赖注入是IoC思想的实现,侧重于实现,A类依赖B类,B类的对象由容器进行创建,容器再对A类中的B b对象进行值的注入。依赖注入在Java中的底层技术原理就是“反射”,使用反射技术对某一个类中的属性进行动态赋值,以达到A模块和B模块之间的解耦。
在Spring中,官方将管理JavaBean的容器定义为IoC容器(IoC container),而在Spring中对IoC的主要实现方式就是依赖注入,依赖注入的称呼更容易被人所接受。