zoukankan      html  css  js  c++  java
  • spring之ioc

    这几天突然想看起spring的源码,顺便将ioc的东西梳理一遍。写之前先抛出问题

    问题

    1、使用ioc的作用在哪里?它比传统的实例化对象的好处在哪里?

    2、ioc统一bean的创建,自动维护bean的依赖关系,那请问,spring容器是怎么实例初始化配置文件中的bean?(详细就可以参考ClassPathXmlApplicationContext的源码分析)。

    见博客https://www.cnblogs.com/wade-luffy/p/6072460.html

     

    一、依赖注入-控制反转的好处是什么?为什么我们要使用它们?

    我们首先理解下字面意思,依赖反转,就是把依赖关系倒过来呗,那正依赖是什么样子呢?

    正依赖

    正着的时候是上层建筑依赖下层建筑,依赖方式是在自己构造的时候把下层先构造好,比如car和wheel  :

     
    class car{
    
      Wheel  wheel  ;
    
      public car(){
    
        wheel  = new wheel();
    
      }
    
    }
    public class wheel{
    }

    Main方法:Bird bird = new Bird();

    这就是典型的上层依赖下层,(为了更方便理解,可以直接把依赖理解为依赖构造函数),这样的坏处是如果下层的构造函数改了,增减了参数,那上层的构造函数也得加上类似的参数,那如果上层还有上层呢?就要一层一层加上去(如果这里不理解的话建议戳上面的链接看知乎原文,答主说的肥肠清晰)。唯一的好处是Main方法倒是很简洁。

    依赖反转

    这里按照上面的理解(为了更方便理解,可以直接把依赖理解为依赖构造函数)叫做取消依赖更合适一些,就是上层不再依赖于下层的构造函数,怎么做到的?下层直接构造好,把整个下层当做参数传进来:

    class car{
      Wheel  wheel ;
      public Car(Wheel  w){
                wheel = w;
      }
    }
    
    public class Wheel{
    
    }

    Main方法:Car car = new Car();  bird = new Bird(wing);

    这样做,如果Wing类构造函数加个参数,只需要改Main方法就行了,坏处是如果建筑层数很多的话,需要从低到高一个一个new,如果用到的地方很多,每次创建一个顶层对象都要这样那真的很麻烦

    其中setter方式的依赖注入我们也顺带讲下。


    ---------setter方式的依赖注入,
    class
    car{   Wheel wheel ;   public Car(){   } public setWheel(Wheel wheel ){ this.wheel = wheel; } } public class Wheel{

    写的一个setter方式依赖注入的demo:

     

     

     

     

     

    这就是一个非常完整的setter依赖注入的例子了,其中UserDaoImpl对象和UserDaoImpl对象的创建就是靠spring容器管理的,回到上面抛出的问题,spring容器是怎么实例初始化配置文件中的bean?(详细就可以参考ClassPathXmlApplicationContext的源码分析)。

    看源码脑壳疼,https://www.cnblogs.com/wade-luffy/p/6072460.html

    总结:依赖注入方便创建高内聚、低耦合的软件,降低了耦合性(将依赖关系从代码中抽出)

    Spring容器是Spring的核心,一切Spring bean都存储在Spring容器内,并由其通过IoC技术管理。Spring容器也就是一个bean工厂(BeanFactory)。应用中bean的实例化,获取,销毁等都是由这个bean工厂管理的。
     
    Spring容器究竟是什么。。。
    org.springframework.context.ApplicationContext接口用于完成容器的配置,初始化,管理bean。一个Spring容器就是某个实现了ApplicationContext接口的类的实例。也就是说,从代码层面,Spring容器其实就是一个ApplicationContext。

     

    总结,依赖注入,我们可以发现上层不再依赖下层,上层对象不再关系下层对象构建的方式细节,它只是提供一个set方法或者构造方法的入参,将下层对象传入进来。比如人需要用一把锤子, 以前可能是人自己去制造这把锤子,会关注着把锤子构建的过程。依赖注入的话,人不再关心这把锤子是怎么构建出来的了,它只需要去别人给他一把锤子,他就开始工作。着降低了耦合性。

  • 相关阅读:
    fscanf_s与scanf_s的宽度参数与缓冲区参数分析
    C语言小程序——推箱子(窄字符和宽字符)
    setlocale()函数详解——C语言
    在源文件(.c)和头文件(.h)中声明和定义的区别——C语言
    枚举类型enum详解——C语言
    宽字符————_T、_TEXT、L、TEXT之间的区别
    宽字符wchar_t和窄字符char——putwchar、wprintf
    extern的使用详解(多文件编程)——C语言
    编程的时候命名词穷了怎么办
    [C#/UI] 使用 await 实现业务对 UI 的控制反转
  • 原文地址:https://www.cnblogs.com/songcuiting/p/13037999.html
Copyright © 2011-2022 走看看