spring学习笔记day01(2):IOC容器底层原理

IOC容器

IOC底层原理

一、IOC的基本概念和原理
  1. 什么是IOC

(1)控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
(2)使用IOC目的:为了耦合度降低
(3)做入门案例就是IOC实现

  1. IOC底层原理

用到的技术:xml解析、工厂模式、反射
使用IOC的原因:原始方式创建和调用对象耦合度太高
举例:类A、类B、类C三个类,A类和C类中创建了B类的对象,且通过该对象调用了B类中的方法调用了B类中的方法,B类的路径或名字等等发生了变化,则需要修改A类和C类中的内容(牵一发动全身,一处改动,其他调用的地方也要跟着修改很不利于开发)本着程序开发高内聚低耦合的原则嘞我们就要努力降低代码间的耦合度(只能尽量降低,不可能完全解耦合)

(1)用工厂模式初步解耦合

  • 这里创建5个类,类A、类B、类C、类D、工厂类E
  • 类E有两个静态方法getC()和getE()调用后会分别创建一个C类的对象和D的对象并返回
  • 类A和B中调用getC()方法和getD()方法
  • 当类C或类D改变时,只用修改工厂类E就可以了
  • 这的确解决了A、B类分别和C、D类之间的耦合但是C、D类和E类之间却还存在着耦合

总结:工厂模式解耦合只是揭开了部分类与类之间的耦合,但是却存在着工厂类和这些类的耦合,当工厂类路径发生变化,还是要修改其他相关联的类。

(2)IOC过程

  • 创建xml配置文件,配置创建的对象
<bean id="user" class="com.laowang.spring5.UserDao">bean>
  • 三个类service类和dao类,创建工厂类
class UserFactory{
     
    public static UserDao getDao(){
     
        //1.xml解析bean中的class路径
        String classValue = 解析出的类路径;
//        2.通过反射创建对象
        Class clazz = Class.forName(classValue);//获取类结构
        return (UserDao)clazz.newInstance();//通过类结构实例化类对象
    }
}

总结:IOC的解耦方式即通过工厂模式解开类与类之间的耦合,再通过配置xml文件,xml解析和反射解开类与工厂之间的耦合,类发生改变时只需要修改配置文件即可,进一步降低了耦合度

IOC接口(BeanFactory)

  1. IOC的思想基于IOC容器完成,IOC容器的底层就是对象工厂
  2. Spring提供IOC容器的两种实现方式:(两个接口)
  • BeanFactory
    IOC容器的基本实现,是Spring 内部 的使用接口,不建议开发人员进行使用
    特点:加载配置文件时不会创建对象,在获取对象的时候才会去创建对象
  • ApplicationContext
    BeanFactory接口的子接口,提供更多更强大的功能,这个就是给开发人员使用的接口了
    特点:和BeanFactory完全相反,即在加载配置文件时就会将配置文件中的对象创建(这两者的区别就和懒汉单例模式和饿汉单例模式的区别差不多吧,懒汉是要的时候创建,饿汉是在类加载的时候创建)
  • 两者对比(哪个好一点),看情况而定,一般web项目要部署到tomcat上,在tomcar启动时将这些对象创建好,和在tomcat启动后运行时需要的时候再创建对象相比,个人觉得是ApplicationContext接口好一点,
  • 总结:要启动快一点就用BeanFactory,要运行丝滑一点就用ApplicationContext不过现在的电脑都差不多啦,只要不是太大的项目两者随便
  1. ApplicationContext接口的实现类(按f4或ctrl+H调出类结构)
  • 在上一篇文章中提到过的两个类
  1. FileSystemXmlApplicationContext
  2. ClassPathXmlApplicationContext
  • 区别
    FileSystemXmlApplicationContext 是根据系统文件路径来查找文件的如:c:\user\data这种用于电脑的路径
    ClassPathXmlApplicationContext 这个是根据类路径来查找文件的,即src下的类路径

spring学习笔记day01(2):IOC容器底层原理_第1张图片

  1. 打开BeanFactory的结构图,这里还有一个子接口,可以包含一些相关的扩展功能
    spring学习笔记day01(2):IOC容器底层原理_第2张图片

你可能感兴趣的:(spring,#,IOC容器,spring,java)