您的位置:首页 > 编程语言 > Java开发

Spring控制反转(IoC)的理解

2011-03-21 22:54 633 查看
Spring框架的核心就是控制反转(Inversion of Control)和依赖注入(Dependency Injection),通过这两方面来实现松耦合。

使用IoC,对象是被动的接受依赖类,而不是自己主动的去找。容器在实例化的时候主动将它的依赖类注入给它。可以这样理解:控制反转将类的主动权转移到接口上,依赖注入通过xml配置文件在类实例化时将其依赖类注入。通过下面的实例来逐步的理解:

首先假设有一个需求,类Business需要调用类Dependency的方法f(),按照日常的做法,得到下面的代码:

//**类Dependency**

public class Dependency {

public void f() {};

}

//**类Business**

public class Business {

Dependency d;

public Business() {

d = new Dependency();

}

public void doSth() {

d.f();

}

}

对上述实现做出如下修改:

首先,将Business里的Dependency实例的获得该为setter方式,其次,将Dependency类改为某个接口的实现。故可以得到下面新的代码:

//**接口IDependency**

public interface IDependency {

void f();

}

//**类Dependency**

public class Dependency implements IDependency {

public void f() {};

}

//**类Business**

public class Business {

IDependency d;

public Business() {}

public void doSth() {

d.f();

}

public void setDependency(IDependency d) {

this.d = d;

}

}

在新的代码中,首先Business的变量d可以接收任何IDependency的实例,另外,Dependency的实例不是通
过Business来获得,而是通过setter(也可以用构造器)来由外部传给它。这似乎跟我们往常的代码没什么不同,但这已经是一个良好的设计。关键
就是Dependency的实例如何从外部注入给Business呢?

这就要通过xml来实现了。

创建一个SpringFirst.xml,进行简单的配置:

<beans>

<bean id = "dependency" class = "aopfirst.business.Dependency" />

<bean

id = "business"

class = "aopfirst.business.Business"

>

<property name = "dependency">

<ref bean = "dependency" />

</property>

</bean>

</beans>

这个配置文件里将Dependency类和Business类加入,并将Dependency作为Business的一个参数。

单有了这个xml文件还不够,还需要一个测试类来加载该xml文件,spring提供了现成的API,在加载上面的xml的时候,
就进行了如下工作:实例化Dependency类,实例化Business类,并将Dependency的实例作为参数赋给了Business实例的

setDependency()方法。下面是该测试程序:

public class StartServer {

public static void main(String [] args) {

ClassPathResource cr = new ClassPathResource("SpringFirst.xml");

BeanFactory factory = new XmlBeanFactory(cr);

Business b = (Business)factory.getBean("business");

b.doSth();

}

}

上面的程序加载了xml以后,获得id为"business"的bean,即Business类的实例,并调用了其doSth()
方法。由此可见,Business的依赖类Dependency是通过xml来注入的,而且Business是通过接口IDependency来接收
Dependency实例。因此,当我们又有新的IDependency的实现时,只需要修改xml文件即可,测试程序只需要根据xml里的id值来获得
需要的参数。

总结上面的例子,对控制反转和依赖注入已经能理解了。依赖类(Dependency)是通过外部(xml)来注入的,而不是由使用它的类
(Business)来自己制造,这就是依赖的注入。另一方面,Business对类Dependency的依赖转移到对接口IDependency的依
赖,控制权由类转移到了接口,即由"实现"转移到"抽象"中。这就是控制反转。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: