当前位置: 首页 > news >正文

【Spring】IOC的核心原理配方


引言 

>IOC就是让对象不再自己new依赖,而是通过容器送进来

文章目录

引言 

一、IOC

1.1 BeanFactory

1.2 XML应用

二、Bean实例流程

2.1 基本流程

2.2 后处理器

2.2.1 Bean工厂后处理器

2.2.2 Bean后处理器

2.3 Bean生命周期

2.3.1 三级缓存

2.3.2 三级缓存源码

2.4 Aware接口

三、Mybatis整合

3.1 基本使用

3.2 源码追踪


一、IOC

1.1 BeanFactory

beanFactory简单案例:

applicationContext简单案例:

源码查看会发现,applicationContext实现类内部其实也包含beanFactory属性

同时applicationContext也继承了beanFactory接口

1.2 XML应用

getBean方法是通过name去寻找bean的,默认使用id,但是也可以通过name1配置别名

当设置bean的范围scope="prototype"时,就不会初始化在单例池中

bean对象的执行顺序:实例化 > 属性赋值 > init初始化

静态工厂方法实例化Bean:

实例化工厂方法实例化Bean

实现FactoryBean接口实例化Bean(工程Bean)

此时查看单例池会发现类型变成了工厂实例

只有首次用的该roleBean时,才会调用getObject方法,缓存实例对象

beans标签的配置选择基本使用

二、Bean实例流程

2.1 基本流程

加载xml文件,封装成BeanDefinition对象存储在beanDefinitionMap中,ApplicationContext遍历map去创建Bean实例对象存储在singletonObjects中。

源码查看:

2.2 后处理器

Spring的后处理器是Spring对外开发的重要扩展点,允许我们介入到Bean的整个实例化流程中来,以达到动态注册BeanDefinition,动态修改BeanDefinition,以及动态修改Bean的作用。

2.2.1 Bean工厂后处理器

BeanFactoryPostProcessor在BeanDefinitionMap填充完毕,Bean实例化之前执行。

或者第二种方案,实现BeanDefinitionRegistryPostProcessor接口

实现一个简单的注解注入bean

2.2.2 Bean后处理器

BeanPostProcessor在工厂后处理器后,初始化前后完成

初始化的顺序

2.3 Bean生命周期

简单来说分为三个阶段:实例化 > 初始化 > 完成

spring在进行属性填充时,会分为下面三种情况:

1.注入普通属性,直接通过set方法反射注入进入;

2.注入单向对象引用属性,先去容器中getBean获取实例在set进去,如果未找到就先创建被注入的bean实例再完成注入;

3.循环依赖问题,双向对象引用属性。

2.3.1 三级缓存

一级缓存singletonObjects:最终存储成品bean的容器

二级缓存earlySingletonObjects:存储半成品,且当前对象已被其他对象引用

三级缓存singletonFactories:存储半成品,对象未被引用,一开始存储地点

基本图解流程:

文字描述:实例化Service后存储三级缓存,进入属性填充步骤需要引用Dao,于是去一二三级逐级获取Dao,此时未找到该对象;就去实例化Dao,再去一二三级缓存中获取Service注入Dao中,Dao经过其他周期后存储到一级缓存,同时删除二三级的Dao,最后Service注入Dao完成实例化存储到一级缓存,删除二三级缓存的Service。

2.3.2 三级缓存源码

于是又执行一次getBean去创建userService实例对象,再将userDao从三级缓存注入到userService

还有一个存储三级缓存的代码,没找到,有没有大佬告知在哪里。

2.4 Aware接口

Aware接口就是Spring提供感知容器能力的机制,一般实现了XXXAware后就拥有了主动访问XXX能力。

三、Mybatis整合

3.1 基本使用

3.2 源码追踪

spring启动,触发MapperScannerConfigurer,MapperScannerConfigurer执行接口BeanDefinitionRegistryPostProcessor的实现方法postProcessBeanDefinitionRegistry

创建ClassPathMapperScanner对象,执行父类的scan方法,scan方法再去调用子类重写的doScan方法。为每个mapper接口创建一个Beandefinition对象,并将这个beandefinition对象的beanClass指向为MapperFactoryBean类型。

当spring创建其他bean时,发现需要依赖对应的mapper和sqlSessionFactory时;spring首先会去通过执行InitializingBean接口的afterProjpertiesSet实现方法;buildSqlSessionFactory会去创建对象,解析执行XML内容,最后创建出重量级的sqlSessionFactory。

接着spring去创建MapperFactoryBean,将sqlSessionFactory注入到mapperFactoryBean中,调用接口FactoryBean的实现方法getObject,通过jdk的动态代理创建一个实现了对应Mapper接口的代理对象

http://www.dtcms.com/a/438949.html

相关文章:

  • 通过HTML演示JVM的垃圾回收-新生代与老年代
  • 网页制作模板的网站网站开发工程师的职务
  • C语言自学--自定义类型:联合和枚举
  • 1.2.2 Function Calling:让 LLM 具备“超能力
  • 通过邮箱查注册网站织梦汽车网站模板免费下载
  • 【附源码】基于Spring Boot的4S店信息管理系统 的设计与实现
  • 工程公司注册经营范围南阳网站优化哪家好
  • LINUX——进度条
  • 淘宝客新增网站可以做黄金期权的网站
  • 微信公众号移动网站开发大连建设银行官网招聘网站
  • 【C++】map与set底层结构——红黑树
  • 知乎 wordpress主题商丘市网络优化公司地址
  • 企业网站设计制作收费6黄页网站建设
  • 注册网站商标长垣网站建设
  • 栈的压入弹出序列--牛客
  • 深圳设计网站南宁专业做网站
  • 同ip网站有什么危害不动产网站建设
  • 卫星通信天线极化角偏差对天线增益、交叉极化隔离度的影响
  • 好用的ppt模板网站公司网站建设费会计分录
  • Day92 基本情报技术者 单词表28 AI応用
  • 蛋糕店网站开发策划书公司网站优点
  • 网络卖东西的平台有哪些公司网站优化推广
  • 2025 AI 治理困局:假新闻围剿与隐私保护的双重博弈
  • 一个RCE命令执行靶场,包含基础命令、shell 特性、常见姿势、常见waf绕过
  • 受欢迎的福州网站建设wordpress后台模块
  • 李宏毅-Generative AI-第一课
  • 服务器安装完面板怎么做网站免费h5页面制作app
  • datawhale RAG技术全栈指南 202509 第5次作业
  • 怎么屏蔽ip段访问网站哪个做网站好
  • 手机电商网站 模板工程信息建程网