首页 > 编程语言 >IoC源码

IoC源码

时间:2023-12-19 10:35:11浏览次数:28  
标签:容器 5.2 实例 FactoryBean Bean 源码 IoC BeanDefinition

主心骨:

  • 解析配置
  • 定位与注册对象
  • 注入对象

一、Bean与BeanDefinition

1、全局掌握核心接口和类

解决了关键问题:
将对象之间的关系转而用配置来管理

  • 依赖注入:依赖关系在Spring的IoC容器中管理
  • 通过把对象包装在Bean中以达到管理对象和进行额外操作的目的

Bean是Spring的一等公民

  • Bean的本质是java对象,只是这个对象的生命周期有容器来管理
  • 不需要为了创建Bean而在与阿莱的java泪上添加任何额外的限制
  • 对java对象的控制方式体现在配置上

2、Bean的定义

根据配置,生成用来描述Bean的BeanDefinition,常用属性:

  • 作用范围scope(@Scope)
  • 懒加载lazy-init(@Lazy):决定Bean实例是否延迟加载
  • 首选promary(@Primary):设置为true的Bean会是优先的实现类
  • factory-bean和factory-method(@Configuration和@Bean)

3、容器初始化主要做的事情

image.png

  • 解析配置
  • 定位与注册对象

4、BeanDefinition家族成员

image.png

  • RootBeanDefinition:不能为其他BeanDefinition的子类,否则设置parentName时会报异常
  • GenericBeanDefinition:替代RootBeanDefinition,完全替代ChildBeanDefinition

5、简单容器

image.png

5.1、BeanFactory和FactoryBean的区别

BeanFactory

  • 获取FactoryBean实例
  • IOC根接口
  • 定义了如何从缓存中获取Bean实例
  • applicationContext.getBean中参数beanName前加“&”获取的是FactoryBean实例,不加“&”获取的是FactoryBean.getObject()生成的bean实例 --> FACTORY_BEAN_PREFIX

FactoryBean:

  • 生成普通的Bean的
  • Spring会根据实现FactoryBean接口的Bean实现的getObject方法,生成Bean

5.2、二级接口

5.2.1、ListableBeanFactory

  • 以列表形式提供Bean的相关信息
  • 批量列出工厂生产实例的信息

5.2.2、HierarhicalBeanFacory

  • 允许BeanFactory进行工厂分层

5.2.3、AutowireCapableBeanFactory

  • 赋予容器自动装配Bean的能力
    :::warning
    组建扫描:
    自动发现应用容器中需要创建的Bean
    自动装配:
    自动满足Bean之间的依赖
    :::

5.2.4、ConfigurableBeanFactory

  • 设置父容器
  • 设置容器的类加载器
  • 属性编辑器
  • 容器通用bean后置处理器
  • 实现singletonBeanRegistry - 提供运行期间向容器注册单例Bean的能力

5.2.5、ConfigurableListableBeanFactory

  • 整合二级接口
  • 忽略自动装配等方法

5.2.6、AbstractAutowireCapableBeanFactory

  • 实现AutowireCapableBeanFactory

5.2.7、DefaultListableBeanFactory

  • 独立运行的IoC容器
  • 实现BeanDefinitionRegistry
  • 包含beanDefinitionMap - 存储容器里所有已经注册过的BeanDefinition实例的载体

6、复杂(高级)容器(上下文)

image.png

6.1、ApplicationContext常用容器

传统的基于XML配置的经典容器:

  • FileSystemXmlApplicationContext:从文件系统加载配置
  • ClassPathXmlApplicaionContext:从classpath加载配置
  • XmlWebApplicationContext:用于Web应用程序的容器

目前比较流行的基于注解的容器:

  • AnnotationConfigServletWebServerApplicationContext:boot模块下
  • AnnotationConfigReactiveWebServerApplicationContext:响应式容器,boot模块下
  • AnnotationConfigApplicationContext:web应用常使用

容器的共性:

  • refresh()大致相同

模版方法模式:
image.png

7、Resource、ResourceLoader和容器之间的关系

image.png

7.1、根据资源自制自动选择正确的Resource

强大的加载资源的方式:

  • 自动识别“classpath:”、“file:”等资源地址前缀
  • 支持自动解析Ant风格带通配符的资源地址
    • Ant:路径匹配表达式,用来对URI进行匹配
      • ? 匹配任何单字符
        • 匹配0或任意数量的字符
      • ** 匹配0或更多的目录
      • image.png

7.2、ResourceLoader

实现不同的Resource加载策略,按需返回特定类型的Resource
image.png

7.3、BeanDefinitionReader

资源加在利器使用者

  • 读取BeanDefinition
  • BeanDefinitionRegistry

image.png

7.3.1、学习过程关键词

  • location
  • Resource
  • ResourceLoader
  • BeanDefinitionReader
  • BeanDefinitionRegistry
  • DefaultListableBeanFactory

7.4、BeanDefinition

8、容器初始化

8.1、后置处理器PostProcessor

本身也是一种需要注册到容器里的Bean

  • 其里面的方法会在特定的时机被容器调用
  • 实现不改变容器或者Bean核心逻辑的情况下对Bean进行扩展
  • 对Bean进行包装、影响其行为、修改Bean的内容等

大类分为容器级别的后置处理器以及Bean级别的后置处理器

  • BeanDefinitionRegistryPostProcessor
  • BeanFactoryPostProcessor
  • BeanPostProcessor
    • postProcessorBeforeInitialization
    • postProcessorAfterInitialization

8.2、Aware及其子接口

Aware(可感知的):

  • 从Bean里获取到容器实例并对其进行操作

标签:容器,5.2,实例,FactoryBean,Bean,源码,IoC,BeanDefinition
From: https://www.cnblogs.com/meidanlong/p/17913113.html

相关文章

  • 35. 干货系列从零用Rust编写负载均衡及代理,代理服务器的源码升级改造
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • springboot015粮食仓库管理系统(毕业设计,附数据库和源码)
    一.4开发的技术介绍一.4.1Springboot介绍一.4.2Java语言一.4.3MySQL数据库一.5论文的结构二需求分析二.1需求设计二.2可行性分析二.2.1技术可行性二.2.2经济可行性二.2.3操作可行性二.3功能需求分析表2-1粮食仓库管理系统功能结构图三系统设计三.1数据库概念结构......
  • springboot012响应式企业员工绩效考评系统(vue,毕业设计,附源码和数据库)
    2 关键技术2.1SpringBoot框架2.2 Maven环境2.3Mysql数据库2.4Vue.js框架2.5小结4 系统分析与设计4.1系统架构在对一个系统的开发中,必须全面的考虑用户对学校系统的需求,这个步骤需要开发出系统的功能的用途,每个图应代表系统的一个功能模块。系统架构图:4.2系统功能设......
  • springboot045新闻推荐系统-计算机毕业设计源码+LW文档
    摘要随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求,创建了一个计算机管理新闻推荐系统的方案。文章介绍了新闻推荐系统的系统分析部分,包括可行性分......
  • 智慧工地源码,劳务实名制信息化管理解决方案
     智慧工地劳务实名制信息化管理解决方案是基于物联网、人脸识别、云计算等信息化技术,与智能终端硬件设备互联互通,完成劳务人员基础数据收集,实现对劳务人员从信息登记、合同管理、劳务进场、安全教育、项目管理、考勤统计、工资结算、工资支付的全过程管控。    劳务实名制......
  • OpenHarmony应用编译 - 如何在源码中编译复杂应用(4.0-Release)
    概述文档环境开发环境:Windows11编译环境:Ubuntu22.04开发板型号:DAYU200(RK3568)系统版本:OpenHarmony-4.0-Release涉及仓库:applications_launcher功能简介在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中,目前有两种编译预安装应用hap包的方式,一种为随系统编译时,编......
  • Java互联网+公立医院绩效考核源码
    一、建设信息化医院绩效考核的意义1.提高考核效率:通过信息化手段,可以将绩效考核数据自动采集、整理、分析和报告,大大提高了考核效率,减少了人工干预和错误率。2.增强考核公正性:信息化考核可以减少人为因素的干扰,使考核更加公正、客观。同时,通过数据共享,可以增强考核结果的透明度和......
  • istioctl 部署 istio
    istio架构:1、下载istio安装包[root@master1~]#curl-Lhttps://istio.io/downloadIstio|ISTIO_VERSION=1.8.2TARGET_ARCH=x86_64sh-2、移动istioctl到/usr/bin目录下[root@master1~]#cpistio-1.8.2/bin/istioctl/usr/bin3、查看istio可用配置列表[root@master1......
  • SpringIOC和AOP机制的学习
    SpringIOC和AOP机制的学习5、HelloSpring_哔哩哔哩_bilibilispringIOC依赖code-block直接导入mvc依赖也可以<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><......
  • asp.net基于WEB层面的云LIS系统平台源码
    随着计算机技术在检验管理方面的广泛应用,以及各种先进的检验仪器在检验医学领域的使用,检验科室对信息化管理提出了更高的要求。正是在这样的背景下开发出了实验室信息管理系统(简称LIS)结合当今各检验科管理及实验室规模的不同状况,充分吸收当今IT科技的最新成就,开发出以高度产品化......