对SpringIoc容器的理解

简介: 对SpringIoc容器的理解

1、Spring的人生哲学  源于容器,止于容器。一说到Spring ioc容器 很多人马上在大脑里浮现出二个概念 控制反转,依赖注入,但是很少有人结合生活 上的案例去思考这个问题,大多数就是背概念,所以导致你对Spring的一知半解。


如何理解:

①:首先 我们从他们的概念入手来理解  控制反转,依赖注入 很多人把这二概念理解为一个事 这是错误的看法 我们首先来 说说“控制反转”这个概念,我首先会把“控制反转” 这四个字拆分为 2个词语

a)控制  我们看到这个词语,就会情不自禁的想  "控制什么东西?"----->控制对象的创建的权力

class  you{
    //有钱
    private Money money = new Money();
    //长得帅
    private Handsome handsome = new HandSome();
    //工作好
    private GodJob godJob = new GodJob();
    BeautyGilr beautyGirl = new BeautyGirl(money,handsome,godJob);
    public void doHappyThings(BeautyGirl beautyGirl) {
        // 下飞行器
    }
    MainTest{
        You  you = new You();
        you.doHappyThings(beautyGirl);
    }
}

从上面的伪代码不难看出,You这个类需要调用doHappyThings 传入的 是一个beautyGirl对象,那么这个对象的创建 由我们程序员自己来创建。我们可以很快的就发现这个创建 beautyGirl的过程十分复杂。 这个就是对象创建的权力 是由我们的程序员控制的



b)反转  什么东西被反转了?控制对象的创建的权力被反转了,那么对象的创建不再有程序员进行创建了,而是有第三方(Spring容器工厂) 给我们创建好了,我们程序员只要 通过每种方式向容器索取 需要的对象就 可以拿到该对象

class  you{
    //向容器索取一个漂亮的女孩子.
    @Autowired
    private BeautyGirl beautyGilr;
    public void doHappyThings(BeautyGirl beautyGirl) {
        ..和漂亮的女孩子做愉快的事情
        log.info("你和美女下飞行器 这是一个愉快的事情")
    }
    MainTest{
        You  you = new You();
        you.doHappyThings(beautyGirl);
    }
}

讲到这里 我们已经很好的理解了 控制反转给我们带来的好处了,直白的说,就是我们程序员业务代码 和我们组件创建的代码彻底的分离开来 进行解构 我们程序员只要专注业务代码,不需要关心我们所需的组件是如何创建来的。真正做到“使用 即有” 不需自己创建。依赖  注入   我们首先来理解“依赖” 二个字  何为依赖,在这里我们是不是形成了一个依赖关系   You这个类  依赖了  BeautyGirl这个类,用大白话说就是  You这个对象中需要使用到BeautyGirl这个对象   那么这种依赖怎么办  怎么给BeautyGirl对象赋值  ,所以才有 “注入”这个概念。就是把BeautyGirl对象注入到   You这个类中。(被注入的对象BeautyGirl 哪来的----->不就是容器的 上一个概念控制反转 通过spring容器工厂创建出来的对象么)

class  you{
    private BeautyGirl beautyGilr;
}

所以从上述的我们可以得出结论    正是由于  有了控制反转  把对象的创建交给容器管理  所以才支持 依赖注入功能。那么依赖注入这个功能 会引入一个容器的先天缺陷 ---->循环依赖

何为循环依赖------- ???

class  you{
    private BeautyGirl beautyGilr;
}
class BeautyGirl{
    private You you;
}

进阶回答  

正是Spring的IOC的核心功能(控制反转 依赖注入)来创建 管理 我们的组件(Controller  service  dao ....)  由于他有这种功能,那么很多第三方开源框架 看中了这点功能,所以第三方开源框架总是想法设法的 想把自己的  组件(比如Redis的RedisTemplate   Rabbitmq的  AmqpRemplate)这些组件的管理 交给Spring 主要是为了给程序员提供了方便,因为程序可以通过spring直接去拿我们的RedisTempalte  而不是要自己去创建该对象。

比如

Spring 整合 MyBatis 利用的就是 Spring 的扩展接口 BeanFacotryPostProcessor 接口   Spring 整合 Nacos 用的就是 ApplicationListener 接口

Spring 整合 Eureka 利用的是   SmartLifecycle 接口  

Spring 整合  Ribbon利用的就是 SmartInitializingSingleton 接口整合  

Spring 整合 Sentinel 利用的 BeanPostProcessor 接口



应用框架的五个理解过程

1)会用 -->  2)懂原理 -->3)懂源码 -->4)改源码 --> 5)写源码

目录
相关文章
|
5月前
|
Java 容器 Spring
Web环境下几种容器与SpringIOC容器
Web环境下几种容器与SpringIOC容器
35 0
|
9月前
|
XML Java 数据格式
认识SpringIOC容器
一、SpringFrameWork 二、SpringIOC容器 三、SpringIoc的核心功能
78 0
|
容器 Java 自动驾驶
java面试题:什么是SpringIOC容器?
java面试题:什么是SpringIOC容器?
java面试题:什么是SpringIOC容器?
|
XML 缓存 Java
SpringIOC容器初始化源码解析(4)—— 手撕Spring容器的刷新逻辑(较硬核)
SpringIOC容器初始化源码解析(4)—— 手撕Spring容器的刷新逻辑(较硬核)
SpringIOC容器初始化源码解析(4)—— 手撕Spring容器的刷新逻辑(较硬核)
|
Java Spring 容器
SpringIOC容器初始化源码解析(3)—— 事件监听器模式
示例代码 回调函数 Spring的事件驱动模型
|
设计模式 Java 数据库连接
SpringIOC容器初始化源码解析(1)—— PostProcessor
后置处理器PostProcessor BeanDefinitionRegistryPostProcessor BeanFactoryPostProcessor BeanPostProcessor
SpringIOC容器初始化源码解析(1)—— PostProcessor
|
XML 存储 Java
SpringIOC源码解析(4)—— Resource、ResourceLoader、容器之间的微妙关系
Resource家族 EncodedResource AbstractResource WritableResource 根据资源地址自动选择正确的Resource ResourceLoader ResourceLoader 的使用者BeanDefinitionReader 利器的使用者 BeanDefinitionReader体系结构 XmlBeanDefinitionReader
SpringIOC源码解析(4)—— Resource、ResourceLoader、容器之间的微妙关系
|
设计模式 XML 缓存
SpringIOC源码解析(3)—— 高级容器
ApplicationContext家族体系 ApplicationContex继承的接口 ApplicationContext常用容器 传统的基于XML配置的经典容器 目前比较流行的容器(都是基于注解的) 容器的共性 ApplicationContext源码 模板方法设计模式
SpringIOC源码解析(3)—— 高级容器
|
存储 Java 容器
SpringIOC源码解析(2)—— 简单容器
BeanFactory 和 FactoryBean 的区别 BeanFactory源码 BeanFactory家族体系 其他术语
SpringIOC源码解析(2)—— 简单容器

热门文章

最新文章