Spring源码学习-后置处理器,Autowired实现原理

news2024/11/25 4:41:44

目录

      • Autowired实现原理
        • populateBean
        • InstantiationAwareBeanPostProcessor
          • AutowiredAnnotationBeanPostProcessor
      • 后置处理器
        • BeanFactory的后置处理器
          • BeanDefinitionRegistryPostProcessor
          • BeanFactoryPostProcesso
          • ConfigurationClassPostProcessor
        • Bean的后置处理器
          • BeanProcessor
          • InstantiationAwareBeanPostProcessor
          • MergedBeanDefinitionPostProcessor
          • SmartInstantiationAwareBeanPostProcessor
      • Bean生命周期总结图

Autowired实现原理

populateBean

给创建好的bean实例进行普通属性的赋值
populateBean

InstantiationAwareBeanPostProcessor

AutowiredAnnotationBeanPostProcessor

这个就是用来完成Autowired注解能够自动装配的bean后置处理器
这个方法初始化了一个set,用来存放需要解析的自动装配注解,里面就包括Autowired,Value和Inject等,之后Spring拿到这些元数据信息直接反射赋值

private final Set<Class<? extends Annotation>> autowiredAnnotationTypes = new LinkedHashSet<>(4);
public AutowiredAnnotationBeanPostProcessor() {
		this.autowiredAnnotationTypes.add(Autowired.class);
		this.autowiredAnnotationTypes.add(Value.class);
		try {
			this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
					ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
			logger.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
		}
		catch (ClassNotFoundException ex) {
			// JSR-330 API not available - simply skip.
		}
	}

后置处理器

BeanFactory的后置处理器

BeanDefinitionRegistryPostProcessor

在容器刷新12步骤中由invokeBeanFactoryPostProcessors方法调用,是bean定义信息注册中心的增强,先去执行实现了PriorityOrdered接口,再去执行实现了Ordered接口的实例对象,最后去执行没有实现顺序接口的bean工厂增强器

BeanFactoryPostProcesso

bean工厂的增强器,执行步骤同BeanDefinitionRegistryPostProcessor一样

ConfigurationClassPostProcessor

配置类的增强处理器,Spring底层通过他继承了BeanDefinitionRegistryPostProcessor实现了bean信息注册中心的增强,把项目中所有的配置类信息解析出来放入信息注册中心,等待后续的Bean创建.使用doProcessConfigurationClass方法解析诸如@Component@ComponentScan等等注解

Bean的后置处理器

由容器刷新12步中的registerBeanPostProcessors方法去专门的注册Bean的后置增强处理器

BeanProcessor
  1. postProcessBeforeInitialization:有机会在对Bean进行填充修改
  2. postProcessAfterInitialization:有机会在对Bean进行填充修改
InstantiationAwareBeanPostProcessor
  1. postProcessAfterInstantiation:bean初始化后进行处理,@Autowired自动装配的赋值可以再次操作,但是他直接返回true,没有做事
  2. postProcessProperties:真正进行自动装配(也可以自己解析自定义的注解进行属性值的注入)
MergedBeanDefinitionPostProcessor

postProcessMergedBeanDefinition:再次修改Bean的定义信息

SmartInstantiationAwareBeanPostProcessor
  1. predictBeanType:在注册监听器registerListeners()步骤触发,是在组件创建之前最后修改组件类型的机会,可以给组件指定任意的类型
  2. determineCandidateConstructors:告诉spring可以用哪些构造器
  3. getEarlyBeanReference:返回早期的Bean引用

对Bean进行代理增强期间进行使用

Bean生命周期总结图

Bean生命周期图

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

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

相关文章

2020年国赛高教杯数学建模D题接触式轮廓仪的自动标注解题全过程文档及程序

2020年国赛高教杯数学建模 D题 接触式轮廓仪的自动标注 原题再现 轮廓仪是一种两坐标测量仪器&#xff08;见图1&#xff09;&#xff0c;它由工作平台、夹具、被测工件、探针、传感器和伺服驱动等部件组成&#xff08;见图2&#xff09;。   接触式轮廓仪的工作原理是&am…

antd-React Table 中文转化

1.首先需要进行中文包导入 2.引入标签对Table进行包裹即可 import zh_CN from antd/lib/locale-provider/zh_CN;import {ConfigProvider} from antd;<ConfigProvider locale{zh_CN}><Tablecolumns{columns}rowKey{record > record.id}dataSource{data}pagination{p…

[Java]重写equals为什么要重写hashcode???配合HashMap源码一起理解

文章目录 1、什么是hashCode2、为什么要有hashCode3、为什么重写 equals 时必须重写 hashCode 方法&#xff1f;4、易错点 1、什么是hashCode hashCode()是Object定义的方法&#xff0c;它将返回一个整型值&#xff0c;这个方法通常用来将对象的内存地址转换为整数之后返回&am…

融云「北极星」数据监控平台:数据可视通晓全局,精准分析定位问题

↑ 点击预约“融云北极星”直播↑ 点击预约“实时社区”直播 近期&#xff0c;融云“北极星”数据系统完成功能迭代&#xff0c;新模块“数据监控平台”正式“履新上任”。关注【融云全球互联网通信云】了解更多 点击图片查看更多详情 此前&#xff0c;“北极星”系统主要为客…

MYSQL中的锁(面试难点重点)

首先说一下 这个加锁是个啥子过程呢 我们拿一条记录举例,这个记录就放在这,没人操作它,他就没生成锁结构, 直到有个事务操作它了,然后给它才生成了个锁结构,锁结构两个参数 trx(生成该锁的事务) is_waiting(正在等待就是:true 没在等待就是 false) (锁里面很多参数 这里这是为…

Linux/Unix-gcc编译回顾

1、gcc编译为可执行程序四步骤&#xff1a;预处理->编译->汇编->链接 注意&#xff1a;-o 用于修改生产的文件名 2、gcc常用参数 指定头文件&#xff1a;-I 语法&#xff1a; gcc -I 头文件所在文件夹路径 源文件 -o 生成文件名 如果头文件和源文件中同一个文件夹…

事务的实现原理

事务的实现 简介特性&#xff08;ACID&#xff09;状态与分类 实现机制日志机制redo logundo log 锁机制 如何使用 简介 有许多小伙伴初学事务还不太清楚是干什么的&#xff0c;那么我们在简介中一次性将事务给搞懂 首先我们先来简单的说一下事务是什么&#xff0c;以便更好的去…

企业数据治理实战总结--数仓面试必备

文章整理自涤生大数据老师宇哥&#xff0c;宇哥是历任中国电信&#xff0c;平安银行&#xff0c;微众银行&#xff0c;众安保险等多家公司擅长大数据求职面试&#xff0c;数仓开发管理&#xff0c;数据治理&#xff0c;数据质量等工作&#xff0c;主导过相关平台的建设 1 数据…

mybatis和dbeaver安装部署连接测试

ORM对象关系映射&#xff0c;把对象和数据库中的数据进行映射。mybatis是orm框架&#xff0c;mybatis-plus是mybatis的增强工具&#xff0c;简化开发。 1.准备mysql数据库 首先安装mysql https://dev.mysql.com/downloads/file/?id518835 设置密码&#xff1a;0000 然后下db…

大数据学习01-Zookeeper分布式集群部署

二、下载 zookeeper官网&#xff0c;本文使用的是zookeeper3.4.8版本 三、安装部署 将下载好的安装包上传至linux服务器上 解压安装包 tar -zxvf zookeeper-3.4.8.tar.gz -C /home/localzookeeper目录重命名 mv zookeeper-3.4.8 zookeeper配置环境 vim /etc/profile添加…

自定义实现list及其功能

#pragma once #include <iostream> #include <assert.h> using namespace std;namespace test {//******************************设置结点******************************template<class T>struct list_node{T _data;list_node<T>* _next;list_node&l…

SQL27 查看不同年龄段的用户明细

selectdevice_id,gender,casewhen age>25 then 25岁及以上when age>20 then 20-24岁when age<20 then 20岁以下else 其他end as age_cut from user_profile

Python property 定义与应用

目录 一、前言二、定义 一、前言 在 Python 类这一节中&#xff0c;会涉及到属性的私有化&#xff0c;私有化的好处在于我们无法轻易地更改类体中属性值&#xff0c;而对于类体中的私有化属性其实也并非真正的私有化&#xff0c;而是一种伪私有化&#xff0c;我们可通过 dir()…

71、redis主从复制的核心原理

redis主从复制的核心原来 通过执行slaveof命令或设置slaveof选项&#xff0c;让一个服务器去复制另一个服务器的数据。主数据库可以进行读写操作&#xff0c;当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的&#xff0c;并接受主数据库同步过来的数…

Android JetPack Compose之主题的理解与使用

目录 概述1.什么是MaterialTheme2.MaterialTheme与CompositionLocal的联系2.1 MaterialTheme的工作原理2.2 CompositionLocal2.3 CompositionLocal的两种创建方式2.3.1 compositionLocalOf2.3.2 staiticCompositionLocalOf 2.4 CompositionLocal总结 概述 根据百度百科知识&am…

Springboot + Vue 上传Word文档并保留内部格式

因为业务需求&#xff0c;上传Word文件需要编辑&#xff0c;但如何使用Blob方式&#xff0c;在数据库里存文件&#xff0c;就会造成格式消失。所以修改思路&#xff1a;上传文件到服务器本地&#xff0c;保证数据存储的完整性。 前端 <el-upload class"upload-demo&quo…

复习PHP基础教程

PHP 安装 PHP 简介PHP 语法 我需要什么&#xff1f; 如需开始使用 PHP&#xff0c;您可以&#xff1a; 使用支持 PHP 和 MySQL 的 web 主机在您的 PC 上安装 web 服务器&#xff0c;然后安装 PHP 和 MySQL。 使用支持 PHP 的 Web 主机 如果您的服务器支持 PHP&#xff0c…

基数排序|RadixSort|C++实现

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

电商 api 接口文档

电商 api 接口文档 1、开篇 欢迎使用ShowDoc&#xff01; API格式&#xff1a; 备注&#xff1a;电商API必须返回如下3个字段&#xff1a; 参数名必选类型说明status是int状态message是string信息提示result否mix结果 2、用户相关 2.1、登录/退出 简要描述&#xff1a; …

【复盘】记录一次类型不一致导致的Kafka消费异常问题

背景 业务主要是通过A系统向B系统写入Kafka&#xff0c;然后B系统消费Kafka 将结果写到Kafka中&#xff0c;A进行消费最终结果。 在整个流程中&#xff0c;A写入Kafka会写入一张 record1表记录&#xff0c;然后在A消费最终结果的时候也记录一张record2表。主要改动的话 只是B系…