博客
关于我
【Spring IOC容器】底层原理
阅读量:320 次
发布时间:2019-03-04

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


文章目录


一、IOC概念和原理

概念

在这里插入图片描述

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


原理

  • xml 解析
  • 工厂模式
  • 反射

举个例子,假设我们有两个类,各自含有方法,其中UserService类要去调用UserDao类的方法:

在这里插入图片描述

  • 使用原始的方式,直接在UserService类中new出UserDao类的对象,通过对象引用去调用方法。但是这种方式的耦合度太高了,也就是说对于这两个类之间的依赖太高,牵一发而动全身~

    在这里插入图片描述

  • 还有一种思想是工厂模式,通过创建一个对象工厂,来实现(如上图所示)。但是,这种模式同时也还具有耦合度的问题。

  • 为了降低耦合度带来的问题,我们就使用到了IOC容器,在利用工厂模式的基础之上,又添加了xml解析反射(通过得到类的字节码文件来操作类中所有内容)。

    在这里插入图片描述

  • 1.通过配置文件,配置需要创建的对象

  • 2.创建工厂类,创建方法

    • 2.1 通过xml解析获取对象的class属性
    • 2.2 通过Class.forName()反射创建对象
    • 2.3 将对象返回出去

优点:当类改变的时候,只需要修改xml文件就可以,进一步降低了耦合度!


二、IOC(接口)

IOC主要接口

IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂.

Spring 提供 IOC 容器实现两种方式:(两个接口)

  • BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

    • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
  • ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用

    • 加载配置文件时候就会把在配置文件对象进行创建

以上两者的作用是都可以去解析xml文件创建对象,可以互换;区别就是创建对象的时期。

在这里插入图片描述

一般来说,整个项目的运行会配有tomcat服务器。所以为了节约资源,在启动服务器的同时,就让类去进行加载,同时创建对象,而不是等到用的时候才去创建,那样既耗时又耗资源,所以一般采用ApplicationContext接口来实现。


ApplicationContext接口主要实现类

在这里插入图片描述

  • ClassPathXmlApplicationContext 从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式

在这里插入图片描述

  • FileSystemXmlApplicationContext 从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件。
    在这里插入图片描述


转载地址:http://kyeq.baihongyu.com/

你可能感兴趣的文章
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>