请参看 http://www.doc88.com/p-671301065056.html
原文及讨论http://bbs.bccn.net/thread-82938-1-1.html
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 {
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的依赖控制权由类转移
到了接口即由"实现"转移到"抽象"中。这就是控制反转。