Spring的基础结构和核心接口
目录
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的基础结构和核心接口的更多相关文章
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- spring 的核心接口
spring有两个核心接口,BeanFactory 和ApplicationContext ,其中ApplicationContext 是BeanFactory的子接口.他们代表了Spring容器. ...
- spring中基础核心接口总结
spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...
- Spring Boot REST(一)核心接口
Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...
- Spring(七)核心容器 - 钩子接口
目录 前言 1.Aware 系列接口 2.InitializingBean 3.BeanPostProcessor 4.BeanFactoryPostProcessor 5.ImportSelecto ...
- 一文带你了解Spring核心接口Ordered的实现及应用
前言 最近在看框架的时候,发现了这个接口,在此进行总结,希望能够给大家帮助,同时提升自己. order接口的大体介绍 Spring框架中有这个一个接口,名字叫Ordered,联想我们在数据库中应用的O ...
- Hibernate详解(5)——Hibernate核心接口和工作原理
Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...
- Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么?
quote:Spring最核心的功能是什么?使用Spring框架的最核心的原因是什么? (IT公司面试手册,可以多看看) spring 框架中核心组件有三个:Core.Context 和 Beans. ...
- Spring之BeanFactory和FactoryBean接口的区别
目录 一.BeanFactory接口 二.FactoryBean接口 1.简单实现 2.增强实现 3.FactoryBean的实际使用案例 三.总结 @ Spring框架中的BeanFactory ...
- 【转】Spring学习---Spring IoC容器的核心原理
[原文] Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国. IoC和DI的基本概念 IoC(控制反转,英文含义:Inverse of Control)是Spr ...
随机推荐
- superset 1.3版本WIN10安装实录
首先说下,为什么要这么做,因为二开需要,二开要有源码,然后对源码修改,编译,所以不能通过类似https://zhuanlan.zhihu.com/p/271695878这种方式,直接安装: 1.去Gi ...
- Jetbrains系列产品无限时间重置插件
概述Jetbrains家的产品有一个很良心的地方,他会允许你试用30天(这个数字写死在代码里了)以评估是否你真的需要为它而付费. 事实上有一款插件可以实现这个功能,你或许可以用它来重置一下试用时间.但 ...
- 解析mysql奇葩语句
首先看看完整的表如下图 那么看看一个比较奇葩的语句 select * from users where name = 'aa'='bb'这个语句为啥能执行成功以及为什么打印出了除了两个aa之外的所有行 ...
- jar脚本练习
javaServer.sh #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_131 export APP_HOME=/u01/app expo ...
- [NOI2014] 购票 题解
首先发现 \(p_x\times dis(x,y)+q_x\) 异常像是能斜率优化的样子,那先把求 \(f_x\) 的式子写出来(下设 \(d_x\) 表示 \(x\) 到根的距离): \[f_x=\ ...
- autMan奥特曼机器人-对插件权限的管理
为了避免某些插件在用户不知情的情况下读取使用用户隐私数据,受" 安卓手机上安装的应用需申请电话.位置.通讯录等权限 "的启发,autMan增加了数据桶读取权限设置页面. 当前受限制 ...
- ADF - [01] 概述
大数据需要可以启用协调和操作过程以将这些巨大的原始数据存储优化为可操作的业务见解的服务. Azure 数据工厂是专为复杂的混合提取-转换-加载 (ETL).提取-加载-转换 (ELT) 和数据集成项目 ...
- Linux - 基础环境检查
检查操作系统:建议根据实际产品需要进行安装 检查主机名:集群中统一前缀并区分服务器功能,小写命名 检查内存:建议至少128G 检查CPU:建议至少2个支持超线程技术的10核芯片 检查磁盘:同一功能的服 ...
- 百万架构师第四十五课:并发编程的基础|JavaGuide
课程目标 1. 多线程的发展历史 2. 线程的应用 3. 并发编程的基础 4. 线程安全的问题 特定的指令,计算机不会存储指令,把指令写下来,一次性读取指令,批处理. 然后我们需要把批处理进行隔离.保 ...
- 记录:tinyrenderer---1.2 Rasterizing the boundary
光栅化三角形 Scanline rendering(扫描线渲染),一个老式的算法 按y轴坐标进行排序,我这里采取降序,ay > by > cy 同时光栅化三角形的左右两边 绘制水平线段,连 ...