搞透 IOC,Spring IOC 看这篇就够了!

搞透 IOC,Spring IOC 看这篇就够了!

IOCAOP属于Spring的核心内容,如果想掌握好Spring你肯定需要对IOC有足够的了解 @mikechen

IOC的定义

IOC是Inversion of Control的缩写,多数书籍翻译成”控制反转”。

IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,如下图所示:

搞透 IOC,Spring IOC 看这篇就够了!

上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠”第三方”了,全部对象的控制权全部上缴给”第三方”IOC容器。

所以,IOC借助于”第三方”实现具有依赖关系的对象之间的解耦,使程序更优良。

IOC与DI的关系

其实IOC包括依赖查找(DL)和依赖注入(DI),只不过DL因为有侵入性 (它需要用户自己去是使用 API 进行查找资源和组装对象),已经被抛弃。

所以现在提到IOC,更多的想到的就是依赖注入(DI)了, 如图所示:

搞透 IOC,Spring IOC 看这篇就够了!

DI的全称是Dependency Injection,中文称之为依赖注入,它与控制反转(IOC)的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。

当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,在传统模式下,调用者通常会采用”new 被调用者”的代码方式来创建对象,如图所示:

搞透 IOC,Spring IOC 看这篇就够了!
这种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护。

在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。

这样,控制权由应用代码转到了Spring容器,控制权发生了反转,这就是Spring的控制反转IOC。

从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入,如图所示:

搞透 IOC,Spring IOC 看这篇就够了!

依赖注入方式

Spring的依赖注入,我们一般使用@Autowired注解来完成,关于依赖注入一般有三种方式:

属性注入、构造器注入、setter方法注入:

1.属性注入

属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    //...

}

2.Set注入

set 方法注入太过于臃肿,实际上很少使用:

@Service
public class UserServiceImpl implements UserService {
    private UserMapper userMapper;
    @Autowired
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

3.构造器注入

构造器注入是官方推荐的方式,如下:

@Service
public class UserServiceImpl implements UserService {
    private final UserMapper userMapper;

    @Autowired
    public UserServiceImpl(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

IOC的优缺点

IOC的优点

实现组件之间的解耦,提高程序的灵活性和可维护性。

IOC的缺点

使用IOC框架产品能够给我们的开发过程带来很大的好处,但是也要充分认识引入IOC框架的缺点,做到心中有数。

  1. 生成一个对象的步骤变复杂了(其实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。
  2. 对象 生成因为是使用反射编程,在效率上有些损耗,但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。

IOC的实现原理

IOC容器其实就是一个大工厂,它用来管理我们所有的对象以及依赖关系。

  • 原理就是通过 Java 的反射技术来实现的,通过反射我们可以获取类的所有信息(成员变量、类名等等等);
  • 再通过配置文件(xml)或者注解来描述类与类之间的关系。

这样我们就可以通过这些配置信息和反射技术来构建出对应的对象和依赖关系了,如下图所示:

搞透 IOC,Spring IOC 看这篇就够了!

IOC容器和对象的创建过程如下:

1.先创建BeanFactory容器

2.加载配置文件,封装成BeanDefinition

3.调用执行BeanFactoryPostprocessor

  • 准备工作;
  • 准备BeanPostProcessor;
  • 准备监听器、事件、广播器;

4.实例化

5.初始化

6.获取到完整对象。

以上

作者简介

陈睿|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,专注于互联网架构技术。

阅读mikechen的互联网架构更多技术文章合集

Java并发|JVM|MySQL|Spring|Redis|分布式|高并发

Original: https://www.cnblogs.com/mikechenshare/p/16729871.html
Author: mikechen的互联网架构
Title: 搞透 IOC,Spring IOC 看这篇就够了!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/801906/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 简单数据处理(相关系数,协方差,t检验)

    数据的处理可谓是重中之重,在衡量数据的好坏,确定接下来各项工作的可行性等方面都不能少了它,那么今天就让我们一起去学习怎么样实现简单数据的各项操作吧! 1.平均数 import nu…

    Python 2023年8月27日
    048
  • NumPy 中的数据统计分析

    NumPy的排序方法有直接排序和间接排序。直接排序是对数据直接进行排序,间接排序是指根据一个或多个键值对数据集进行排序。直接排序使用 sort()函数,间接排序使用 argsort…

    Python 2023年8月26日
    029
  • Flask 框架:运用Echarts绘制图形

    echarts是百度推出的一款开源的基于 JavaScript的可视化图表库,该开发库目前发展非常不错,且支持各类图形的绘制可定制程度高,Echarts绘图库同样可以与 Flask…

    Python 2023年8月9日
    052
  • 为了摸鱼,我开发了一个工具网站

    🏡 博客首页:派 大 星⛳️ 欢迎关注 🐳 点赞 🎒 收藏 ✏️ 留言🎢 本文由派大星原创编撰🚧 系列专栏:《开源专栏》🎈 本系列主要输出作者自创的开源项目🔗 作品:www.jso…

    Python 2023年9月26日
    044
  • 数据挖掘中的大数据量分批增量训练

    1、lightgbm 这个我好像代码在另一个电脑上,待更吧。。。星期一把代码完善一下。。。先简单介绍一下什么叫增量训练,就是他一下子吃不了那么多数据,内存会爆掉,但是需要读怎么办,…

    Python 2023年8月25日
    033
  • Python开发游戏超简单 │ 经典游戏《Jetpac重返地球》

    导语 好几天没写小游戏啦~今天就安排一波!! 游戏梗概:主人公流落外星球,遇到一群不讲道理的外星人。想跑路,载具又摔得七零八落。 任务:顶着外星人的进攻,把宇宙飞船的零件都找回来并…

    Python 2023年9月20日
    042
  • vue生命周期

    搬运太累了,这里就直接放链接吧。 vue生命周期 posted @2022-06-12 21:47 百分号 阅读(5 ) 评论() 编辑 Original: https://www…

    Python 2023年6月10日
    073
  • numpy 笔记:改变形态

    1 添加维度 原始数组如下: import numpy as np a = np.array([1,2,3,4,5,6]) a.shape #(6,) 1.1 np.newaxis…

    Python 2023年8月29日
    038
  • python指数平滑预测_python – Pandas:列的指数平滑函数

    也许你正在寻找 an exponentially weighted moving average: import pandas as pd import datetime as D…

    Python 2023年8月8日
    032
  • 宝塔配置应用管理器(django)

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年8月6日
    049
  • AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码

    先贴一下已经集成好的项目地址, 如果对如何集成不感兴趣, 想直接使用的, 可以跳过这部分, 直接看使用部分 AIR32F103CBT6的存储是128K Flash + 32K RA…

    Python 2023年10月15日
    054
  • 【广播机制】Numpy,Pytorch,Tensorflow

    广播机制 广播机制是为了解决两个不同尺寸之间的数组(张量)之间的计算问题而设计的一种算法机制,在numpy中就存在这种机制,而Pytorch和Tensorflow为了减少学习成本,…

    Python 2023年8月25日
    035
  • ImGUI 1.87 绘制D3D外部菜单

    ImGUI 它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,该框架通常会配合特定的D3Dx9等图形开发工具包一起使用,I…

    Python 2023年10月20日
    053
  • 火爆出圈的OpenAI模型ChatGPT体验

    1、ChatGPT简要介绍 ChatGPT是一种高效的语言模型,全称为”聊天式自动回复生成技术”(Chat-based Automatic Reply Ge…

    Python 2023年9月16日
    085
  • 【python】pythonPTA编程题练习

    7-2 计算某天距元旦的天数 分数 10作者 王祥荣单位 宁波财经学院输入年、月、日,要求输出该年份的元旦到该日期总共经过了多少天。(提示:闰年是指能被400 整除的年份或者能被4…

    Python 2023年8月1日
    041
  • Obsidian中如何记录自己的灵感?

    在生活中当中你是否会在某个瞬间产生一个想法,但没过多久就想不起来了,正所谓灵感转瞬即逝,那我们不妨在灵感出现的时候顺手将他记录下来。记录的过程要求简单、方便且不会花费我们太多时间,…

    Python 2023年6月3日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球