zoukankan      html  css  js  c++  java
  • 【Spring 从0开始】IOC 容器、底层原理

    一、什么是IOC

    IOC 是控制反转,把对象创建和对象之间的调用过程,交给 Spring 来管理,可以使代码耦合度降低。

    在上篇中,使用了xml管理对象的创建,其实这就是IOC的实现。

    二、IOC底层原理

    IOC的实现主要用到了3种技术:工厂模式、XML解析、反射。

    1. 工厂模式介绍

    原始状态

    用图示表示下,初始的对象调用的样子。比如我在 UserService 类中想调用 UserDao 类下的 add() 方法,需要 new 一个 UserDao 的对象。

    但是这种调用方法会让 UserService 和 UserDao 这2个类耦合过于紧密。比如,当 UserDao 路径变化了,UserService 里也要跟着变。
    本着高内聚、低耦合,我们还需要进一步降低程序的耦合。

    工厂模式

    于是,为了更好的解耦合,出现了工厂模式。加入了工厂之后,上面的对象调用关系就变成了这样:

    通过 UserFactory 这个工厂类,降低 UserService 和 UserDao 这2个类的耦合。

    但是,UserFactory 这个工厂也是一个类,这个类与其它的耦合也仍然是存在,所以这仍然不是最终方案。
    若再进一步的降低耦合,则是用到 IOC 的方案了。

    XML解析用来获取或操作文件里的内容。而反射则是通过得到类的字节码文件,也就是写的java文件编译后的class文件,然后操作类中的所有内容。

    2. IOC 执行过程

    第一步

    通过 XML 文件,进行对象的配置。比如我在文件里配置了一个 user 对象。

    第二步

    有了 XML 文件后,IOC就可以解析文件获取对象,然后创建工厂类,进行对象的返回了。

    图示代码仅示意用:

    1. 通过解析XML,拿到class属性的值。
    2. 通过反射,创建对象。
    3. 创建对象,返回。

    同样是用到工厂模式,不过通过IOC的方式,进一步降低了耦合度。
    因为,这时候就算 User 类的路径变了,不是这个 "com.pingguo.spring5.User",那么只需要改XML文件即可,不需要改其他的代码。

    三、IOC 接口

    IOC 容器其实指得就是对象工厂,而在 spring 里,提供了两种实现 IOC 容器的方式(接口)。
    在上篇文章的测试代码中,我把 ApplicationContext 替换成 BeanFactory 一样可以正常运行。

    1. BeanFactory

    Spring 内部使用的接口,一般不提供给我们开发人员使用。它的特点是:

    • 加载配置文件的时候不会创建对象,当使用对象的时候才会创建对象。

    2. ApplicationContext

    BeanFactory 是 ApplicationContext 的子接口,提供了更多、更强大的功能,这个接口是面向我们开发人员使用的。

    如果你使用 idea 编辑器,可以 Ctrl+左击 BeanFactory ,然后点击 BeanFactory 前面的 ↓ 箭头看到实现的父接口。

    它的特点与 BeanFactory 相反:

    • 加载配置文件的时候,就会创建配置的对象。

    3. ApplicationContext 的两个主要实现类

    可以单击 ApplicationContext,按 Ctrl+H,查看结构。

    • ClassPathXmlApplicationContext:在上篇的示例代码里,使用的就是这个类。它的特点是,这里直接写 src 下的xml文件路径即可。

    • FileSystemXmlApplicationContext:这里用的是文件在磁盘里的全路径,比如D:IdeaProjectsspring5_demosrcean1.xml

    4. BeanFactory 与 ApplicationContext 谁更好?

    乍一看感觉 BeanFactory 更好一些,因为我需要用的时候再创建,节省资源。

    不过,站在实际生产的角度,spring通常是应用于web项目,比如结合tomcat。那么当tomcat的启动的时候,我们更希望把这些耗时耗资源的操作,都在项目启动的时候处理,会更合适。

    --不要用肉体的勤奋,去掩盖思考的懒惰--
  • 相关阅读:
    javascript延迟对象
    Fetch-新一代Ajax API
    AJAX笔记
    VR/AR/MR
    为什么Javascript有设计缺陷
    Javascript函数式编程
    vim基本操作
    Git 常用命令(二)
    SSH配置
    C# NPOI导出Excel和EPPlus导出Excel
  • 原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/14941403.html
Copyright © 2011-2022 走看看