Spring IOC 的深入理解

101 阅读4分钟

@TOC


1.Spring是什么?

Spring是一个生态,可以构建java应用所需要的一切基础设施。通常spring指的是spring frameWork. 一般的生态来说:

  • 1.Spring FrameWork

  • 2.SpringBoot 增加了自动配置 总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可

  • 3.SpringMVC

  • 4.SpringCloud 分布式的springboot,适用于分布式

而spring 是一个轻量级开源框架: IOC:控制翻转 AOP:面向切面编程

2 .IOC控制反转

本意: 对象的创建由我们自己new转到了spring ioc容器中,由spring ioc容器统一管理、 这样的好处: 降低对象间的耦合度 底层分析: xml配置文件、反射、简单工厂模式 我们通过读取xml配置文件(bean id+class),通过读取类的全路径,来进行反射创建对象,然后这个过程是由spring ioc完成的,我们只需要调用它提供的方法即可获得对象,这是简单工厂模式。

3.IOC的两种实现

1)BeanFactory接口 这个接口是基本实现,一般不提供开发人员使用,并且加载配置文件的时候是懒加载,不会创建对象。 2)ApplicationContext接口(其中实现的是BeanFactory接口) 这个接口是提供给开发人员使用的,有相对多的功能,加载配置文件的就会创建对象,所以相对式慢启动、快响应。

4.Bean的管理

1)创建对象 2)为对象设置属性 一般分为基于xml的配置文件和基于注解方式的实现: xml文件: 创建对象:在xml文件配置bean 注入属性(DI):构造注入/设置注入(set),可以注入简单属性的值,也可以注入其他类的对象,包括注入外部bean、注入内部bean、

基于注解: 创建对象:在xml文件配置component-scan,然后再要创建对象的类上加入注解:@component、@service、@Reposity、@Controller 注入属性(DI):在属性上加入注解:@Autowire、@Vlaue、@Qualifier、@Resource

5:DI和IOC

可以看到IOC式控制翻转,主要是创建对象的思想,而真正的实现是由反射+简单工厂,然后通过DI技术实现对象的属性赋值

6.scope

一般是单例、可以设置多例、还有不常用session、request,一次请求创建一个bean,一个会话创建一个bean

7.spring的单例安全

单例:一般如果涉及到无状态的bean(没有属性),那么肯定用单例,并且安全 但是如果有状态的bean,单例则不安全了,我们一般用多例模式;当然还可以在单例模式下设置属性ThreadLocal来保证每个线程有自己的属性。

8.spring bean的常见生命周期

简单来说: 创建对象---->注入属性---->后置处理器的Before方法------>初始化方法-------->后置处理器的After方法------>获得对象 销毁对象------>调用destory方法(写了才有用) 在这里插入图片描述 为了更好理解,可以重构成实例化、属性注入、初始化、销毁四个主要部分,其余部分相当于使用AOP技术,如果实现了相关接口,才会有这些过程。

  • 1.BeanFactoryPostProcessor的bean定义
  • BeanFactoryPostProcessor接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。 说通俗一些就是可以管理我们的bean工厂内所有的beandefinition(未实例化)数据,可以随心所欲的修改属性
  • 2.InstantiationAwareBeanPostProcessor的bean定义
  • postProcessBeforeInstantiation方法
  • 3.实例化
  • 4.InstantiationAwareBeanPostProcessor的bean定义
  • postProcessAfterInstantiation方法
  • 5.注入属性
  • 6.Aware接口 【BeanNameAware接口】调用BeanNameAware.setBeanName() 【BeanFactoryAware】调用BeanFactoryAware.setBeanFactory() 【ApplicationContextAware】调用ApplicationContextAware.setApplicationContext()
  • 7.BeanPostProcessor的bean定义
  • postProcessBeforeInitialization方法
  • 8.InitializingBean的接口
  • InitializingBean.afterPropertiesSet()方法
  • 9.初始化init
  • 10.BeanPostProcessor的bean定义
  • postProcessAfterInitialization方法
  • 11.DisposableBean接口
  • destroy()方法
  • 12.自定义init_destory()方法

9.Spring 怎么解决循环依赖问题?

  • 三级缓存
  • singletonObjects 一级缓存
  • earlySingletonObjects 二级缓存
  • singletonFactories 三级缓存

情景一(没有循环依赖)----一级缓存

在这里插入图片描述

情景二(有循环依赖,没有Aop) -----二级缓存

在这里插入图片描述 最后把半成品池(二级缓存)的对象销毁; 在这里插入图片描述 注:无法解决Aop代理对象

情景三(有循环依赖,有Aop)----三级缓存

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 步骤:(待)

blog.csdn.net/lkforce/art… blog.csdn.net/m0_43448868… www.bilibili.com/video/BV1ET…