目录

1、BeanDefinition

2、BeanDefinitionReader

3、BeanDefinitionRegistry

4、BeanFactory

5、ApplicationContext

6、BeanPostProcessor

7、BeanFactoryPostProcessor

8、BeanDefinitionRegistryPostProcessor

9、总结

一、BeanDefinition

BeanDefinition 描述了一个Bean的实例定义信息,它记录了Bean的相关信息,并且可以设置以及获取Bean的内容,例如:Bean类名,Bean的作用域,Bean是否懒加载,,

初始化方法名称,销毁方法名称,是否单例,是否原型,Bean属性值等等,直至根据BeanDefinition 生成Bean,可以说在Bean的管理中起到至关重要的作用

二、BeanDefinitionReader

看名称顾名思义是用来读取Bean的定义信息生成BeanDefinition 并注册:

  • XmlBeanDefinitionReader: 用来解析Xml读取信息生成BeanDefinition并注册

  • AnnotatedBeanDefinitionReader: 读取注解生成BeanDefinition并注册

  • ClassPathBeanDefinitionScanner: 扫描类路径生成BeanDefinition并注册

注意:这里的注册要分清楚不是注册Bean,可以理解为保存bean的BeanDefination到BeanDefinitionRegistry中提供给后续的Bean生成使用

三、BeanDefinitionRegistry

看名称是BeanDefinition注册的接口,主要是对BeanDefinition做一个管理操作,例如注册、移除、获取等,实现了AliasRegistry,即还可以对Bean的别名进行管理

注意:DefaultListableBeanFactory即是一个Bean的工厂同时也可以完成BeanDefination注册,这个是一个很重要的角色

四、BeanFactory是Spring容器的顶层接口

BeanFactory是Spring容器的顶层接口,提供了对Bean的基本操作,其实现类根据其特点基本实现了对Bean的各种操作;

从BeanFactory来看:

  • HierarchicalBeanFactory: 层次结构的BeanFactory提供两个方法getParentBeanFactory获取当前BeanFactory的父类,containsLocalBean当前BeanFactory是否包含指定名称的bean

  • ListableBeanFactory: 可罗列的BeanFactory,这里的可罗列意味着此BeanFactory提供类似于 Map<String, T> getBeansOfType (@Nullable Class type)这种获取满足条件的一系列bean的功能

  • AutowireCapableBeanFactory: 具备自动装备功能的BeanFactory,提供了createBean实例化,属性填充,回调生命周期的创建bean,autowire自动装配bean,initializeBean 回调相关初始化方法等方法

  • ConfigurableBeanFactory : 可配置的BeanFactory,提供了setParentBeanFactory ,setBeanClassLoader,addBeanPostProcessor等配置bean工厂的方法

  • ConfigurableListableBeanFactory: 实现了ListableBeanFactory ,AutowireCapableBeanFactory ,ConfigurableBeanFactory,具备其他三者的功能的同时,还提供了ignoreDependencyType 忽略给定依赖类型的自动装配,registerResolvableDependency 注册指定类型的依赖使用指定的对象进行注入等功能

五、ApplicationContext

这个可以说是Spring的容器,总体来说也是一个BeanFactory,其实是对BeanFactory功能的更多扩展:

  • EnvironmentCapable: 提供获取Environment的能力

  • ResourceLoader: 用于加载资源(例如类路径或文件系统资源)的策略接口,根据路径获取资源包装成Resource

  • ResourcePatternResolver: ResourceLoader的子接口,提供根据路径匹配获取资源的能力

  • ApplicationEventPublisher : 事件发送接口

  • MessageSource: 用于解析消息的策略接口,用于实现国际化

两个重要的实现类:

  • AnnotationConfigApplicationContext: 基于注解包路径扫描的容器上下文,通过注解扫描来完成BeanDefinition的注册

  • ClassPathXmlApplicationContext: 基于类路径下xml文件的Spring应用程序上下文,通过解析类路径下的xml来完成BeanDefinition的注册

六、BeanPostProcessor

Bean后置处理器(重中之重!!!),内部有两个方法:

  • postProcessBeforeInitialization: Bean初始化前调用

  • postProcessAfterInitialization: Bean初始化后调用

源代码如下:

另一个实现了它的拓展接口InstantiationAwareBeanPostProcessor内部新增了4个方法:

  • postProcessBeforeInstantiation:Bean实例化前调用

  • postProcessAfterInstantiation:Bean实例化后调用

  • postProcessProperties:Bean属性注入的时候调用

  • postProcessPropertyValues:Bean属性注入的时候调用

源代码如下:

列举两个与我们平时息息相关的BeanPostProcessor:

  • AutowiredAnnotationBeanPostProcessor: 对@Autowired注解标识的做属性注入(此注解原理),还有其他注解例如: @Value,@Lookup,@Inject

  • CommonAnnoatationBeanPostProcessor: 与上面那个一样,但主要处理@Resource注解

七、BeanFactoryPostProcessor

源代码如下:

名称跟上面那位大哥很像,这个也是后置处理器,但是是BeanFactory的后置处理器,对BeanFactory相关信息可以做一些修改

使用目的:在BeanFactory标准初始化之后调用,用来定制和修改BeanFactory内的内容;

八、BeanDefinitionRegistryPostProcessor

继承了上面那位大哥,同样会在BeanFactory之后调用,但是内部多了个对BeanDefination处理的方法,该方法可以对BeanFactory中的BeanDefination做一次后置的统一处理,

该方法执行顺序在postProcessBeanFactory之前

比如@Configuration注解的底层原理就是通过实现 BeanDefinitionRegistryPostProcessor接口,然后扫描并生成BeanDefination并注册的,具体的实现类是ConfigurationClassPostProcessor

九、总结

上面的一些核心接口是不是都看懵逼了,不需要记得特别清楚,只需要知道个大概就行了:

  • 1、解析Xml配置或者扫描注解生成BeanDefination加入到BeanFactory,

  • 2、BeanDefinitionRegistryPostProcessor对加入到BeanFactory的BeanDefination可以做增删改查操作,

  • 3、BeanFactoryPostProcessor可以对BeanFactory后置修改操作,

  • 4、然后会把BeanPostProcessor注册到BeanFactory中,

  • 5、最后根据BeanDefination生成Bean,在生成过程中BeanPostProcessor会起到作用

上面几个核心大概的执行顺序如下:

Spring的基础结构和核心接口的更多相关文章

  1. 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)

    Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...

  2. spring 的核心接口

    spring有两个核心接口,BeanFactory 和ApplicationContext  ,其中ApplicationContext 是BeanFactory的子接口.他们代表了Spring容器. ...

  3. spring中基础核心接口总结

    spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...

  4. Spring Boot REST(一)核心接口

    Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...

  5. Spring(七)核心容器 - 钩子接口

    目录 前言 1.Aware 系列接口 2.InitializingBean 3.BeanPostProcessor 4.BeanFactoryPostProcessor 5.ImportSelecto ...

  6. 一文带你了解Spring核心接口Ordered的实现及应用

    前言 最近在看框架的时候,发现了这个接口,在此进行总结,希望能够给大家帮助,同时提升自己. order接口的大体介绍 Spring框架中有这个一个接口,名字叫Ordered,联想我们在数据库中应用的O ...

  7. Hibernate详解(5)——Hibernate核心接口和工作原理

    Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...

  8. Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么?

    quote:Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么? (IT公司面试手册,可以多看看) spring 框架中核心组件有三个:Core.Context 和 Beans. ...

  9. Spring之BeanFactory和FactoryBean接口的区别

    目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @   Spring框架中的BeanFactory ...

  10. 【转】Spring学习---Spring IoC容器的核心原理

    [原文] Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国. IoC和DI的基本概念 IoC(控制反转,英文含义:Inverse of Control)是Spr ...

随机推荐

  1. Mybatis框架详解

    Mybatis框架(1)---Mybatis入门 mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache sof ...

  2. uni-app根据不同的类型绑定不同类名

    <template> <view class="page-demo"> <view class="demo" v-for=&quo ...

  3. 腾讯云HAI服务器上部署与调用DeepSeek-R1大模型的实战指南

    上次我们大概了解了一下 DeepSeek-R1 大模型,并简单提及了 Ollama 的一些基本信息.今天,我们将深入实际操作,利用腾讯云的 HAI 服务器进行 5 分钟部署,并实现本地 DeepSee ...

  4. DeepSeek-R1 技术全景解析:从原理到实践的“炼金术配方” ——附多阶段训练流程图与核心误区澄清

    字数:约3200字|预计阅读时间:8分钟 (调试着R1的API接口,看着控制台瀑布般流淌的思维链日志)此刻我仿佛看到AlphaGo的棋谱在代码世界重生--这是属于推理模型的AlphaZero时刻. D ...

  5. [源码分析] Facebook如何训练超大模型--- (5)

    [源码分析] Facebook如何训练超大模型--- (5) 目录 [源码分析] Facebook如何训练超大模型--- (5) 0x00 摘要 0x01 背景 0x02 思路 2.1 学习建议 2. ...

  6. Java连接数据库 CreateStatement 和 PrepareStatement 的区别与优劣

    一.简介 先说下CreateStatement 和 PrepareStatement 这俩到底是干啥的吧. 作用:其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方 ...

  7. python 爬取博客访问量

    一.代码 """ Version: Python3.5 Author: OniOn Site: http://www.cnblogs.com/TM0831/ Time: ...

  8. FreeSql学习笔记——1.入门

    前言 学习过程中,使用的是.Net 5 WebApi项目,数据库使用的是SQL Server,主要会整理下常用的api,现在就开始吧~   初始化 先选择一个WebCoreApi项目进行创建,创建完项 ...

  9. autMan奥特曼机器人-实时翻译的用法

    一.基本配置 访问并登录百度翻译开放平台:https://api.fanyi.baidu.com/ 进入开发者信息获取 APP ID和密钥,并开通"通用文本翻译"服务 autMan ...

  10. 万字解析Golang的map实现原理

    0.引言 相信大家对Map这个数据结构都不陌生,像C++的map.Java的HashMap.各个语言的底层实现各有不同,在本篇博客中,我将分享个人对Go的map实现的理解,以及深入源码进行分析,相信耐 ...