zoukankan      html  css  js  c++  java
  • (II)第一节:IOC 和 DI

    一、IOC(Inversion(反转) Of Control):控制反转

      控制:资源的获取方式:

      (1)主动式:(每次要什么资源,就直接创建即可)

    BookServlet{
        BookService bs = new BookService();
        AirPlane ap = new AirPlane();//复杂对象的创建是比较庞大的工程;
    }

      (2)被动式:资源的获取,不是我们自己创建,而是交给一个容器来创建和设置;

    BookServlet{
        BookService bs;
        
        public void test1(){
                bs.checkout();//      
            }   
    }

      

      容器:管理所有的组件(有功能的类);假设,BookServlet受容器管理,BookService也受容器管理;

      容器可以自动的探查出哪些组件(类)需要用到另一些组件(类);容器帮我们创建BookService对象,并把BookService对象赋值过去。

      从之前的主动的new资源变为被动的接受资源;

      (容器)婚介所;从主动获取资源到被动接受

      

      在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

      反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式

    二、DI(Dependency Injection):依赖注入

      如果IOC是一种思想,那DI就是一种思想实现的一种描述

      容器能知道哪个组件(类)运行时,需要另一个组件(类);

      上列中,容器通过反射的形式,将容器中准备好的BookService对象注入(利用反射给属性赋值)到BookServlet中

      只要是容器管理的组件(类),都能使用容器提供的强大功能;

      

      IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。

      总结: IOC 就是一种反转控制的思想, 而DI是对IOC的一种具体实现

    三、IOC容器在Spring中的实现

      前提:  Spring中有IOC思想,  IOC思想必须基于 IOC容器(ApplicationContext)来完成, 而IOC容器在最底层实质上就是一个对象工厂.

     

      1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化。

      2)Spring提供了IOC容器的两种实现方式

        ① BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。

        ② ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

     

      利用反射技术,通过全类名加载文件,使用无参构造方法,创建 Java 对象

    四、ApplicationContext的主要实现类

      (1) ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件(相对路径)

      (2) FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文件(绝对路径)

      (3)在初始化时就创建单例的bean,也可以通过配置的方式指定创建的Bean是多实例的。

    五、ConfigurableApplicationContext

      (1)是ApplicationContext的子接口,包含一些扩展方法

      (2) refresh()和close()让ApplicationContext具有启动、关闭和刷新上下文的能力。

    六、WebApplicationContext

      专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作

    七、容器的结构图

      

  • 相关阅读:
    中国广电工信战争
    围观一个People Search
    Popular榜单能做到小众化吗?
    校园招聘:内地大学生的视野和实践有问题吗?
    锐推榜的平衡策略
    PyQt 自定义信号带参数 emit
    Python pyinstaller
    Python 匿名函数 lambda
    PyQT5 绑定函数的传参(connect 带参数)
    Excel 一列文本变为数字
  • 原文地址:https://www.cnblogs.com/niujifei/p/15389143.html
Copyright © 2011-2022 走看看