spring中的依赖注入和控制反转(一)

  控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(DependencyLookup)。依赖注入应用比较广泛。


  1.控制反转(Inversion of Control)与依赖注入(Dependency Injection)

 

  控制反转,它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

  IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJBApache Avalon都使用这种方式。<2>依赖注入(DependencyInjection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型,其又有接口注入(Interface Injection),设值注入(Setter Injection)和构造子注入(ConstructorInjection)三种方式。

  依赖注入之所以更流行是因为它是一种更可取的方式:让容器全权负责依赖查询,受管组件只需要暴露JavaBean的setter方法或者带参数的构造子或者接口,使容器可以在初始化时组装对象的依赖关系。其与依赖查找方式相比,主要优势为:<1>查找定位操作与应用代码完全无关。<2>不依赖于容器的API,可以很容易地在任何容器以外使用应用对象。<3>不需要特殊的接口,绝大多数对象可以做到完全不必依赖容器

  

  2.spring中的控制反转和依赖注入

  spring中,不管是依赖注入,还是控制反转,他们的含义是完全相同的。当某个java对象需要调用另一个java对象的方法是,在传统模式下通常有如下做法:

  原始做法:调用者主动创建被依赖对象,然后再调用被依赖对象的方法

  简单工厂模式:调用者先找到被依赖对象的工程,然后主动通过工厂去获取被依赖对象,最后在调用被依赖对象的方法。

   对于原始做法,由于调用者需要通过形如“new被依赖对象的构造器();”的代码创建对象,因此必然导致调用者与依赖对象实现类的硬编码耦合,非常不利于项目升级和维护。

  对于简单工厂来说,大致需要把握三点:第一,调用者面向被依赖对象的接口变成;第二,将被依赖对象创建交个工厂完成;第三,调用者通过工厂来获得被依赖的组件。通过这三点改造,可以保证调用者只需与被依赖对象的接口耦合,这就避免了类层次的硬编码耦合。这种方式卫衣的缺点是,调用组件需要主动通过工程去获取被依赖对象,这就会带来调用组件与被依赖对象工程的耦合。

  使用spring框架之后,调用者无需主动获取被依赖对象,调用者只要被动接收spring容器为调用者的成员变量赋值即可(只要配置一个<property ../>子元素,spring就会执行对应的setter方法为调用者的成员变量赋值 )。由此可见,使用spring框架之后,调用者获取被依赖对象的方式由原来的主动获取变成了被动接受,于是——Rod Johnson将这种方式成为控制反转

  spring容器的角度来看,spring容器负责将被依赖对象赋值给调用者的成员变量——相当于调用者 注入它的依赖的实例,因此Martine Fowler 将这种方式成为依赖注入。

  正因为spring将被依赖对象注入给调用者,所以调用者无需主动获取被依赖对象,只要被动等待spring容器注入即可,由此可见,控制反转和依赖注入其实是同一种行为的两种表达,只是描述角度不同而已。


  3.依赖注入类型

  依赖注入主要通过设值注入和构造注入两种。

      设值注入是指IOC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因为在spring的依赖注入里面大量使用;

      构造注入是在构造实例时,已经完成了依赖关系的初始化。通俗来说,就是驱动spring在底层一反射方式执行带指定参数的构造器,当执行带参数的构造器是,就可以来用构造器参数对成员变量执行初始化——这就是构造注入的本质。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值