Spring控制反转的理解

请参看 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的依赖控制权由类转移

到了接口即由"实现"转移到"抽象"中。这就是控制反转。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjmz30071360

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值