博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]spring IOC 控制反转
阅读量:5160 次
发布时间:2019-06-13

本文共 2211 字,大约阅读时间需要 7 分钟。

本文转自:

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的依赖,控制权由类转移到了接口,即由"实现"转移到"抽象"中。这就是控制反转。

转载于:https://www.cnblogs.com/freeliver54/archive/2012/10/16/2725387.html

你可能感兴趣的文章
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
多表查询
查看>>
单表查询
查看>>
网络并发 数据库可能的面试题
查看>>
mysql 之多表查询
查看>>
高大上版解决粘包问题
查看>>
前端之BOM和DOM
查看>>
前端之JS
查看>>
前端之BootStrap
查看>>
前端之jQuery
查看>>
HTML 前端
查看>>
pycharm 导入 新安装 moudle
查看>>
ES使用text类型字段排序报错
查看>>
Core源码(二) Linq的Distinct扩展
查看>>
Core源码(三) Lazy<T>
查看>>
分库情况下的数据库连接注入
查看>>
Spring MVC
查看>>
AFO以后的机房游记
查看>>