对Spring IOC容器的思考
最近在看Spring5的视频教学,学到了IOC容器这块,对IOC有些浅薄的理解,分享一二;有错误之处,还请大佬指出
IOC(Inversion of Control 控制反转),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。什么叫降低耦合度,大致理解就是在对代码进行维护升级的时候,尽量不去动源代码,而是采用其它方式来进行功能实现,而最常用的就是利用DI(Dependency Injection 依赖注入),通过更改配置文件的方式,来进行升级维护
在讨论IOC容器之前,我们要思考,为什么我们要解耦,先来个例子:
我们每天所使用的手机可以理解为一个Phone类实例,其中它有很多组成部分来构成,比如CPU、屏幕、喇叭等等。。。这些基础的元素就是类中的一个个属性,我们也可以称之为手机的依赖,DI(依赖注入)你就可以理解为一个给属性赋值的动作。然后具体的属性比如屏幕,它又属于Screen类的一个实例,它也有自己的一些属性,比如玻璃、屏幕中间的传感器等等。这样从大到小,每个类由好多属性构成,每个属性又是一个类实例,又继续分下去,可以想象当我们要造一个最新的IPhone 13手机的时候,要为每个基础属性赋值(注入依赖),不断的new实例(比如new Glass()),然后将实例作为上一层类的属性注入,然后再重复封装,直到最后组装成为一个IPhone 13手机,这时候我们才造好了一个手机。如果我们还要造另外的手机IPhone 13Pro,那么我们又要对代码进行大规模的改动。牵一发(制造另外的手机)而动全身(更改手机的基本属性)
在实际的开发过程中,其实也是在各种类实例、基本数据类型作为类的属性,这将是一个巨大的工程,没人敢这么玩。
因此这时候,我们就需要解耦,怎么解呢?这就涉及到了今天的主题:IOC容器。
IOC容器是干嘛的呢,它其实就是解决了在实际开发过程中不用new的方式来造对象,而最常用的就是采用DI注入依赖(DI后面马上会重新写一个博客再说说我的看法),最常用的就是按配置文件来进行注入,通过DI利用反射+工厂模式,来动态的帮我们造对象,省去了上面说所的手动new的工程,在实际开发中,我们只需要对修改配置文件(DI需要用到的),就可以完成功能的升级、完善。这样,底层源代码还是底层源代码,不需要去改动,所要做的事就只是改我们的配置文件。
对Spring IOC容器的思考的更多相关文章
- Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- Spring IOC 容器源码分析系列文章导读
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- Spring IoC容器的初始化过程
Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生 ...
- 【Spring】非Spring IOC容器下获取Spring IOC上下文的环境
前言 在Spring Web项目中,有些特殊的时候需要在非Spring IOC容器下获取Spring IOC容器的上下文环境,比如获取某个bean. 版本说明 声明POM文件,指定需引入的JAR. & ...
- 学习Spring(一) 实例化Spring IoC容器
实例化Spring IoC容器 1,读取其配置来创建bean实例 2,然后从Spring IoC容器中得到可用的bean实例 Spring提供两种IoC容器实现类型 a,一种为bean工厂 b,应用程 ...
- MyEclipse Spring 学习总结一 Spring IOC容器
一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加spin ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
随机推荐
- 论文翻译:2020_WaveCRN: An efficient convolutional recurrent neural network for end-to-end speech enhancement
论文地址:用于端到端语音增强的卷积递归神经网络 论文代码:https://github.com/aleXiehta/WaveCRN 引用格式:Hsieh T A, Wang H M, Lu X, et ...
- request.setAttribute()和session.setAttribute()的区别详解
我们在Servlet和页面间传值时,经常会用到request.setAttribute()和session.setAttribute(),下面是两段示例用法 request.setAttribute( ...
- Mac Maven 安装及配置
一.下载 打开 Maven 官方下载页面:https://maven.apache.org/download.cgi#,点击下载链接即可开始下载: 以 Maven 3.8.4 为例,解压后可以 ...
- Django(76)isort工具对import导入进行排序
前言 我们在开发项目时经常会进行导包有import *格式的,还有from * import *格式的,最后就会显示的很乱,那么有没有什么工具能对导包进行一键排序呢?答案是有的,使用isort工具 i ...
- SUNTANS 及 FVCOM 对流扩散方程求解简介[TBC]
最近接到一个任务,就是解决FVCOM中对流扩散计算不守衡问题.导师认为是其求解时候水平和垂向计算分开求解所导致的,目前我也没搞清到底有什么问题,反正就是让把SUNTANS的对流扩散计算挪到FVCOM中 ...
- RNA_seq 热图绘制
若已经拿到表达矩阵exprSet 若差异较大,进行log缩小不同样本的差距 1.热图全体 1 ##加载包 2 library(pheatmap) 3 4 ##缩小表达量差距 5 exprSet < ...
- Python基础之赋值与注释
目录 1. 花式赋值 1.1 链式赋值 1.2 交叉赋值 1.3 交叉赋值(解压缩) 2. 注释 2.1 单行注释 2.2 多行注释 1. 花式赋值 1.1 链式赋值 a = 10 b = 10 c ...
- Linux—yum安装python-pip
centos下安装pip时失败: [root@wfm ~]# yum -y install pipLoaded plugins: fastestmirror, refresh-packagekit, ...
- C/C++ Qt 数据库QSql增删改查组件应用
Qt SQL模块是Qt中用来操作数据库的类,该类封装了各种SQL数据库接口,可以很方便的链接并使用,数据的获取也使用了典型的Model/View结构,通过MV结构映射我们可以实现数据与通用组件的灵活绑 ...
- HTML 基本标签2
HTML标题通过<h1>-<h6>标签定义(<h1>定义最大的标题,<h6>定义最小的标题) <html>用于定义HTML文档 HTML段落 ...