Spring框架的核心就是控制反转(IOC)和依赖注入(Dependency Injection),通过这两个方面来实现耦合。
使用Ioc,对象是被动的接受依赖类,而不是主动的去找。容器在实例化的时候主动将它的依赖类注入给它。通俗理解:控制反转就是将类的主动权转移到接口上,依赖注入通过xml配置文件在类实例化时将其依赖注入。
通过一个实际的例子来理解:
假设需求为:类Business需要调用类Dependency的方法f()。
我们常规做法如下:
//1.创建类Dependency public class Dependency { //创建类的方法 public void f() {}; } //2.创建类Business public class Business { //属性 Dependency d; //方法 //方法功能:new一个实例对象 public Business() { d = new Dependency(); } public void doSth() { d.f(); } } //3.创建对象,调用方法 b = new Business(); b.doSth;
在此,针对如上方法做出一些修改
1.将Business里面的Dependency实例的获得改为setter方式
2.将Dependency类改为某个接口的实现
//1.创建类Dependency public class Dependency { public void f() {}; } //2.创建接口Idependency public interface Idependency { //这个方法的参数可以是一个对象 void f(); } //3.创建类Business public class Business { Idependency d; public void setDependency(Idependency d) { this.d =d; } public void doSth() { d.f(); } }
在如上代码中,
1.Business的实例变量d可以接收任何Idependency类型的实例对象
2.Dependency的实例对象不是通过Business来获得,而是通过接口中方法的参数传进来
3.Dependency的实例对象如何从外部注入给Business呢?这就要通过xml文件来实现。
4.创建一个SpringXX.xml文件,进行简单配置:
<beans> <bean id = "dependency" class = "xx.xx.Dependency" /> <bean id = "business" calss = "xx.xx.Business" > <property name = "dependency"> <ref bean = "dependency" /> </property> </bean> </beans>
如上的配置文件里将Dependency类和Business类加入,并将Dependency的实例对象作为Business实例对象的方法的一参数。
5.写一个测试类来加载xml文件,spring提供了现成的API,在加载上面的xml文件的时候,完成了如下工作:1>实例化Dependency类和Business类,并将Dependency的实例对象作为参数赋值给了Business的实例对象的setDependency()方法。测试程序如下:
public class CeShi { public static void main(String [] args) { //1.加载xml文件 XXclass xx = new XXclass("SpringXX.xml"); BeanFactory factory = new XmlBeanFactory(xx); //2.实例对象 Business b = (Business)factory.getBean("business"); //3.用实例的对象调用方法 b.doSth(); } }
上面的程序加载了xml文件后,获得id为"business"的bean,即Business类的实例,并调用了他的方法doSth()。由此可见,Business的依赖包Dependency是通过xml来注入的,并且Business是通过接口Idependency来接收Dependency实例。因此,有新的Idependency的实现时,只需要修改xml文件即可,测试程序只需要根据xml里面的id值来获得需要的参数即可。
总结,通过上面的例子,对控制反转和依赖注入已经能理解了,依赖类(Dependency)是通过外部(xml)来注入的,而不是使用它的类(Business)来自己创建,这就是依赖注入。另一方面,Business对类Dependency的依赖转移到对接口Idependency的依赖,控制权由类转到了接口,即由“实现”转移到“抽象”中,这就是控制反转。
控制反转(Ioc)的理解
很简单,本来该我们自己做的事情,我们不做,让系统去做。例如,当我们需要调用某个对象的实例方法时,我们往往需要先new出这个实例对象,再用实例对象去调用方法;如果使用了控制反转,则我们不需要做如上事情了,只需要在配置文件xml里面配置好就行,系统帮我们new实例对象。
依赖注入的理解
spring主动创建被调用类的对象,然后把这个对象注入到我们自己的类中,使得我们可以使用它。
//参考例子
http://www.cnblogs.com/xing901022/p/3963962.html