Spring源码学习-核心注解,架构以及整体流程

news2024/11/26 4:25:07

目录

    • 核心注解
    • 核心组件接口分析
      • 基础接口
        • Resource+ResourceLoader
          • Resource
          • ResourceLoader
        • BeanFactory
          • 结构解析图示
          • 核心的子接口
        • BeanDefinition
          • 加载注册流程(xml形式的)
        • BeanDefinitionReader
        • BeanDefinitionRegistry
        • ApplicationContext
          • 类结构图示
          • 结构解析
        • Aware
          • 接口类图
          • xxAware是什么时候赋值进来
          • 判断后置处理器
      • 基础类
        • DefaultListableBeanFactory
        • DefaultSingletonBeanRegistry
        • GenericApplicationContext

核心注解

注解功能
@Bean容器中注册组件
@Primary同类组件如果有多个,标注主组件
@DependsOn组件之间声明依赖关系
@Lazy组件懒加载(最后使用的时候才创建)
@Scope声明组件的作用范围(SCOPE_PROTOTYPE,SCOPE_SINGLETON)
@Configuration声明这是一个配置类,替换以前配置文件
@Component@Controller、@Service、@Repository
@Indexed加速注解,所有标注了 @Indexed 的组件,直接会启动快速加载
@Order数字越小优先级越高,越先工作
@ComponentScan包扫描
@Conditional条件注入
@Import导入第三方jar包中的组件,或定制批量导入组件逻辑
@ImportResource导入以前的xml配置文件,让其生效
@Profile基于多环境激活
@PropertySource外部properties配置文件和JavaBean进行绑定.结合ConfigurationProperties
@PropertySources@PropertySource组合注解
@Autowired自动装配
@Qualifier精确指定
@Value取值、计算机环境变量、JVM系统。xxxx。@Value(“${xx}”)
@Lookup单例组件依赖非单例组件,非单例组件获取需要使用方法

注:@Indexed 需要引入依赖

	<groupId>org.springframework</groupId>
	<artifactId>spring-context-indexer</artifactId>
	<optional>true</optional>
</dependency>```

核心组件接口分析

基础接口

Resource+ResourceLoader

Resource

它是spring自己定义的一个资源抽象接口,表示所有需要加载到spring的bean容器中的资源,来自于xml以及注解的bean,甚至是网络和本地磁盘当中,都可以用它表示

ResourceLoader

spring定义的资源加载器(策略模式接口),通过不同的策略实现,加载不同情况的bean封装为resource资源
AbstractApplicationContext作为环境类持有ResourcePatternResolver接口(通过这个策略模式去调用真正的资源加载实现类)

BeanFactory

作为spring的一个基础的抽象工厂接口

结构解析图示

BeanFactory

核心的子接口
  • HierarchicalBeanFactory:定义父子工厂(父子容器)
  • ListableBeanFacotory:的实现是DefaultListableBeanFactory,保存了ioc容器中的核心信息
  • AutowireCapableBeanFactory:提供自动装配能力
  • AnnotationApplicationContext组合了档案馆,他有自动装配能力

BeanDefinition

Bean的定义信息接口,封装bean需要的信息属性

加载注册流程(xml形式的)

加载注册流程

他会被BeanDefinitionHolder类进行一层封装,它封装了bean的名称和别名数组,以及BeanDefinition自身,方便后续对他的处理操作

BeanDefinitionReader

读取Bean信息的策略接口,他是Bean信息的一个读取器,他有XmlBeanDefinitionReader具体的实现类用来读取xml中的bean配置信息.它本身也持有IOC容器类的环境,组合传进去的

BeanDefinitionParserDelegate用来解析从xml配置文件读取到的Dom文档(解释器模式)
读取器具体的实现又去组合资源加载策略接口ResourceLoader(Spring中运用了相当之多的组合,他在组合与继承以及接口之间做了相当美妙的平衡,我觉得这里面才是值得仔细去思考和学习的)

BeanDefinitionRegistry

bean定义信息注册中心,提供一个必须要实现的registerBeanDefinition方法,由具体的类去实现

ApplicationContext

类结构图示

ApplicationContext

结构解析
  • IOC事件派发器
  • 国际化解析
  • bean工厂功能–自动装配是被组合进来的
  • 资源解析功能

Aware

接口类图

Aware

xxAware是什么时候赋值进来

xxAware

判断后置处理器
if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
				bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
				bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ||
				bean instanceof ApplicationStartupAware)) {
			return bean;
		}

先去缓存的单实例池拿到bean,拿不到的话再去创建

基础类

DefaultListableBeanFactory

这是spring的关键类,属于是spring的’档案馆’,他继承和实现一系列的接口并且通过组合的方式,保存了spring的bean实例信息(通过多个ConcurrentHashMap),后续spring拿到这些读取到的bean图纸信息,再根据信息去创建相应的Bean

//组合模式,Spring里面允许有很多工厂(工厂之间的bean可以隔离开 不过实际上目前没有这么使用过的)
	private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
			new ConcurrentHashMap<>(8);
/** Map of bean definition objects, keyed by bean name. */
	//所有BeanDefinition信息按照名字对应BeanDefinition关系都保存好了
	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
/** Map of singleton-only bean names, keyed by dependency type. */
	//Spring中按照类型得到组件的一个底层池
	//按照类型保存单实例bean的名称
	private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);
/** List of bean definition names, in registration order. */
	//保存所有bean定义的名称
	private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

结构图示

DefaultSingletonBeanRegistry

这是spring的单例对象缓存池,包括三级缓存也是在这个类中。

/** spring是使用享元完成单例模式,使用单例对象池(单例享元池返回组件) */
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

GenericApplicationContext

将上面的DefaultListableBeanFactory组合进来用来存储bean的定义和信息,通过继承资源类和实现ApplicationContext接口获得ioc容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后端Long类型传到前端精度丢失的问题

问题出现&#xff1a;后端的Java Bean的id属性是用的Long类型对应数据库主键使用bigint类型&#xff0c;当使用JSON方式传递该数据给前端时&#xff0c;前端接收到的数据末尾会变成0。&#xff08;发生的精度丢失问题&#xff09; 问题原因&#xff1a;Java中的long能表示的范围…

域名下配置,dns TXT记录,防止任意邮件伪造

每日鸡汤&#xff1a;每个你想要学习的瞬间都是未来的你向自己求救 最近在做一个网页的项目&#xff0c;这个项目和之前的项目的区别是部署在海外的服务器上&#xff0c;为了方便国外的用户访问&#xff0c;所以在埋点统计这块我们就选择了谷歌统计。国内的项目一般使用百度统计…

管道泄漏监测系统:天然气管道泄漏监测

随着我国城市化进程的快速推进&#xff0c;城市燃气管网也不断扩张&#xff0c;规模日益庞大&#xff0c;地下管线错综复杂&#xff0c;城市燃气管网的建设和运营面临着越来越多的挑战。然而&#xff0c;很多城市在建设过程中过于注重地上设施&#xff0c;对地下管网的科学管控…

ORCA优化器浅析——​MD Accessor的三级缓存

分析​MD Accessor对元数据的缓存能力 set client_min_messageslog; set optimizer to on; set optimizer_print_optimization_stats to on; --执行SQLoptimizer_print_optimization_stats GUC会打印处ORCA优化器优化流程中的各步骤的统计数据。分析打印日志如下&#xff0c;由…

[分布式] Ceph实战应用

目录 一、建 CephFS 文件系统 MDS 接口服务端操作客户端操作 二、创建 Ceph 块存储系统 RBD 接口创建 Ceph 对象存储系统 RGW 接口OSD 故障模拟与恢复 一、建 CephFS 文件系统 MDS 接口 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds creat…

流程图实现,基于vue2实现的流程图

1.基本思路 flex布局 伪元素实现竖直的连接线组件递归 2.效果图 2.1基础的&#xff08;未截全&#xff0c;大致长这样&#xff09; 2.2带有收缩功能的&#xff0c;可以展开和收缩并显示数量 3.待需要优化的点&#xff0c;根节点居中是基于整个流程图大小的来居中的&#xf…

【Spring Boot】Spring Boot的系统配置 — 实战:实现系统多环境配置

实战&#xff1a;实现系统多环境配置 在实际项目开发的过程中&#xff0c;需要面对不同的运行环境&#xff0c;比如开发环境、测试环境、生产环境等&#xff0c;每个运行环境的数据库、Redis服务器等配置都不相同&#xff0c;每次发布测试、更新生产都需要手动修改相关系统配置…

delete删除的数据如何恢复?delete删除的数据找回

在数字时代&#xff0c;我们经常处理大量的数据&#xff0c;无论是工作、学习还是个人生活。然而&#xff0c;数据的增多也带来了新的挑战&#xff0c;其中最令人头疼的便是数据丢失问题&#xff0c;例如因操作失误而删除了重要的文件或数据。本文将探讨如何恢复delete删除的数…

租赁小程序开发|在线租赁小程序开发|租赁系统源码

近年来&#xff0c;随着共享经济的兴起&#xff0c;租赁服务逐渐成为了人们生活中不可或缺的一部分。为了方便用户租赁物品或者服务&#xff0c;租赁小程序应运而生。租赁小程序开发具有许多功能优势&#xff0c;使其成为租赁行业的重要工具。本文将介绍一些租赁小程序开发的功…

研发效能认证学员作品:如何实现在DevSecOps的测试左移丨IDCF

作者&#xff1a;赵露润 &#xff08;现就职于赛意信息科技有限公司&#xff09; 研发效能&#xff08;DevOps&#xff09;工程师认证学员、PMP 认证、ITIL4 认证 前言 一个自主研发的ITDevOps系统&#xff0c;承载的主要功能有产品信息树管理&#xff0c;敏捷协同管理&…

如何使用自动化构造随机路由模型

为什么要仿真随机路由&#xff1f; 路由器测试中&#xff0c;为了最大程度还原现网路由情况&#xff0c;评估路由器在现网环境下稳定工作各项指标&#xff0c;需要对导入路由进行离散仿真&#xff0c;目前路由仿真可分为导入路由与生成路由两种方式&#xff0c;导入路由需要现…

S3C2440使用GPIO输入功能控制按键

文章目录 前言一、设置GPIO输入模式二、检测开关1.配置功能2.具体实现 总结 前言 由于上期分享的使用GPIO去控制引脚输出模式点亮LED&#xff0c;那么本期主要介绍一下使用GPIO设置为输入模式&#xff0c;用到的硬件有板载的按键&#xff1b;开发环境也是依赖于S3C2440开发板&…

Hyper-V安装Ubuntu-18.04

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备工作&#xff1f;二、下载指定的Ubuntu ISO镜像三、开始配置1.点击快速创建2.选择安装源 四、开始安装五、配置启动项总结 前言 最近有个很扯淡的问题…

Linux 学习记录51(ARM篇)

Linux 学习记录51(ARM篇) 本文目录 Linux 学习记录51(ARM篇)一、计算机的组成二、编译的原理三、指令和指令集1. 机器指令2. 汇编指令3. 指令集(1. RISC&#xff1a;精简指令集(2. CISC&#xff1a;复杂指令集(3. 精简指令集补充 四、ARM相关介绍1. Arm发展简介2. ARM架构3. AR…

仓库管理系统到底包括哪些方面?

仓库管理系统到底包括哪些方面&#xff1f; 1&#xff09;入库 采购产品到货后&#xff0c;需要进行入库处理。填写采购单号&#xff0c;供应商信息&#xff0c;仓库信息&#xff0c;以及入库明细&#xff0c;提交流程完成入库登记。 “入库明细”中选择货品编码后&#xff…

四阶龙格-库塔方法matlab程序与误差对比

四阶龙格-库塔方法matlab程序与误差对比 简介参考code四阶龙格-库塔函数微分方程函数主程序 结果分析 简介 本例子函数参考了【1】中的函数&#xff0c;增加了解析方法的函数与四阶龙格-库塔方法对比&#xff0c;并计算了百分比误差&#xff0c;最大误差在0.3%左右。 参考 【…

网站创建002:head内容

一个html网站&#xff0c;包括html根、head头、body身体 首先来看head&#xff0c;head操作的是页签标题&#xff0c;如下 1、给head添加图标&#xff0c;如下 <link rel"icon" href"C:\Users\86158\Desktop\网站创建\favicon.ico">2、给网站添加搜索…

Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

依赖注入三种方式,以及传统xml文件传参,还包括@Bean方式传参,还有Resource注入(详细版,每步都有提及)

获取bean对象&#xff0c;也称为对象装配&#xff0c;对象注入&#xff0c;依赖注入。 对象装配的实现方法有3种&#xff1a; 1.属性注入&#xff1b; 2.构造方法注入&#xff1b; 3.Setter注入。 再讲本节内容之前&#xff0c;我们先来提两个传参的方式&#xff0c;首先呢…

Twitter重新突围或许借助国产技术是个好办法

Meta公司近期推出的Threads 被网友戏称为“Twitter杀手”&#xff0c;该应用上线仅一天&#xff0c;用户就突破了3000 万人。外界普遍认为&#xff0c;这是推特上线17年来遭遇的最严峻危机。面对扎克伯格来势汹汹的挑战马斯克会如何快速组织反击&#xff1f; 前段时间闹得沸沸扬…