SpringFrameWork最基本框架场景及其原理

news2024/11/17 9:52:45

Hook扩展点

  • Hook钩子是一种编程思想,也是监听者模式的一种实现。在控制中心的执行过程(可理解也模板方法)中,会调用分阶段或者分层次来调用用户注册进来的Hook方法,用来修改或者监听控制中心的逻辑。
  • 如果需要将控制中心的内容暴露出来,可以选择Hook或者Publish Event

Spring框架在org.springframework.context.support.AbstractApplicationContext#refresh的时候,留下了非常多的Hook,用于灵活接口框架内部实现及开发者功能扩展。

Bean生命周期Hook

Bean的实例化会经过如下流程,最终调用AbstractAutowireCapableBeanFactory#createBean(java.lang.Class<T>)实例化Bean

AbstractApplicationContext#refresh -> finishBeanFactoryInitialization为容器填充相关对象,实例化bean(实例化剩余的bean)
实现了后置处理器的bean均不在这里进行注册 -> preInstantiateSingletons生产单例 -> getBean -> doCreateBean。

Hook全部列表

@Component
public class AllBeanPostProcessor implements InstantiationAwareBeanPostProcessor,
        SmartInstantiationAwareBeanPostProcessor,
        MergedBeanDefinitionPostProcessor,
        DestructionAwareBeanPostProcessor {
    // 来源InstantiationAwareBeanPostProcessor  Instantiation-实例化的意思,反射调用构造方法实例化
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        return null;
    }

    // 来源BeanPostProcessor  Initialization-初始化,实例化后用户可以手动调用方法初始化
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    // 来源SmartInstantiationAwareBeanPostProcessor
    @Override
    public Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
        return SmartInstantiationAwareBeanPostProcessor.super.predictBeanType(beanClass, beanName);
    }

    @Override
    public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
        return SmartInstantiationAwareBeanPostProcessor.super.determineCandidateConstructors(beanClass, beanName);
    }

    @Override
    public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
        return SmartInstantiationAwareBeanPostProcessor.super.getEarlyBeanReference(bean, beanName);
    }

    // 来源MergedBeanDefinitionPostProcessor
    @Override
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {

    }

    @Override
    public void resetBeanDefinition(String beanName) {
        MergedBeanDefinitionPostProcessor.super.resetBeanDefinition(beanName);
    }

    // 来源DestructionAwareBeanPostProcessor
    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {

    }

    @Override
    public boolean requiresDestruction(Object bean) {
        return true;
    }
}
  1. 在反射实例化之前,会applyBeanPostProcessorsBeforeInstantiation确定是否在回调中实例化,如果实例化,则applyBeanPostProcessorsAfterInitialization来执行全部BeanPostProcessor#postProcessAfterInitialization来后置处理Bean。

    try {
        // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
        Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
        if (bean != null) {
            return bean;
        }
    }
    if (targetType != null) {
        bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
        if (bean != null) {
            bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
        }
    }
    
  2. AbstractAutowireCapableBeanFactory#createBeanInstance会通过determineConstructorsFromBeanPostProcessors,选择合适的Constructor,没有指定则使用autowireConstructor自动推理使用合适的构造方法。

    // Candidate constructors for autowiring?
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
        mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
        return autowireConstructor(beanName, mbd, ctors, args);
    }
    

在这里插入图片描述

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

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

相关文章

node.js+uni计算机毕设项目二手物品交易论坛小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

第10章_索引优化与查询优化

第10章_索引优化与查询优化 都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——索引建立关联查询太多JOIN (设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)———调整my.cnf。数据过多――分库分表 关于数据库调优的…

C++ 配置opencv 4.5.0开发环境

C++ 配置opencv 4.5.0开发环境 一、安装包下载二、安装过程三、VS环境配置一、安装包下载 这里提供两种下载方法:   1. opencv官网   2. csdn资源下载 二、安装过程 2.1 下载opencv-4.5.0安装包  2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解压完成…

包教包会——Cookie、Session、Token、JWT

前言 最近在做一个登陆注册的功能&#xff0c;这个功能要用到JWT鉴权。提到鉴权又想到自己直接学的Cookie&#xff0c;Session&#xff0c;Token。就想干脆也用一篇文章小小的概括一下。 &#x1f60b;&#x1f60b; 用文章输出这种方式来记录学习过程&#xff0c;并且日后可…

初识Node.js与内置模块

文章目录目标一、初识 Node.js1、回顾与思考&#xff08;1&#xff09;已经掌握了哪些技术&#xff08;2&#xff09;浏览器中的 JavaScript 的组成部分&#xff08;3&#xff09;思考&#xff1a;为什么 JavaScript 可以在浏览器中被执行&#xff08;4&#xff09;思考&#x…

Python图像处理【6】通过哈希查找重复和类似的图像

通过哈希查找重复和类似的图像0. 前言1. 哈希函数2. 使用哈希函数查找重复图像3. 使用感知哈希函数查找相似图像3.1 感知哈希函数3.2 查找相似图像4.3 查找指定目录中的相似图像小结系列链接0. 前言 在本节中&#xff0c;我们将讨论图像搜索中的两个相关问题&#xff0c;即使用…

node.js+uni计算机毕设项目贵州苗族文化展播微信小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

IP多播(计算机网络-网络层)

目录 一对多通信的应用需求 单播 vs 多播 多播路由器&#xff08;Multicast Router&#xff09; IP 多播的一些特点 D 类 IP 地址与以太网多播地址的映射关系 IP多播需要两种协议 互联网组管理协议 IGMP 多播路由选择协议 两种多播路由选择方法 建议的IP多播路由选择协…

后渗透操作(一)

在通过木马或者漏洞获得靶机的远程控制权后接下来就是后渗透的过程了&#xff0c;meterpreter可以看作一个支持多操作平台的高级后门工具&#xff0c;可以实现特权提升、信息攫取、系统监控、跳板攻击与内网拓展等多样化的功能特性。 一、访问文件系统 对于文件系统的访问有如…

腾讯云轻量应用服务器使用Typecho 应用镜像搭建博客!

Typecho 是开源的博客建站平台&#xff0c;具有轻量、高效、稳定等特点&#xff0c;操作界面简洁友好。该镜像基于 CentOS 7.6 64 位操作系统&#xff0c;并已预置 Nginx、PHP、MariaDB 软件。您可以使用它快速搭建博客、企业官网、电商、论坛等各类网站。 操作步骤 登录 轻量…

博士毕业论文答辩PPT的基本要点

博士毕业论文答辩PPT的基本要点 有借鉴和参考价值的地址或链接&#xff1a; 1、https://blog.csdn.net/lwz45698752/article/details/106648720 研究背景及研究意义 研究内容 总结以研究成果 里边的配色、结果展示的方式很值得借鉴&#xff0c;看起来重点突出&#xff0c…

【Pandas入门教程】如何轻松处理时间序列数据

如何轻松处理时间序列数据 来源&#xff1a;Pandas官网&#xff1a;https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 笔记托管&#xff1a;https://gitee.com/DingJiaxiong/machine-learning-study 文章目录如何轻松处理时间序列数据导包数据准备【…

RV1126笔记十八:吸烟行为检测及部署<五>

若该文为原创文章,转载请注明原文出处。 ubuntu16.04上搭建转化成RKNN环境并把onnx转成RKNN模型(ubuntu16.04) onnx模型转rknn模型需要用到py3.8,所以搭建环境在转换,下面全部操作都是虚拟机下进行。 注意:转模型用py3.6, 训练用py3.8 一、miniconda安装 1、下载地址…

tensorflow01——安装,结构

从官网安装anaconda 安装tensorflow 注意tensorflow对应特定的python版本如3.6&#xff0c;3.7 直接从官网下载的anaconda会对应下载最新版本的python3.9 所以需要新建一个环境来装我们的tensorflow和它对应的python &#xff08;macbook m2&#xff09; 01创建新的环境命名…

【详细说明】二代身份证号码的组成结构(含校验码算法与行政区划代码)

文章内容&#xff1a;二代身份证号码的组成结构&#xff08;含校验码算法与行政区划代码&#xff09; 关键词组&#xff1a;身份证号码、组成、校验码、行政区划码 使用软件&#xff1a;无 虚拟环境&#xff1a;无 操作系统&#xff1a;Windows 11 【图源中国政府网】 文章目录…

node.js+uni计算机毕设项目广播剧微信小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

Node.js - 模块化

文章目录目标一、模块化的基本概念1、什么是模块化&#xff08;1&#xff09;现实生活中的模块化&#xff08;2&#xff09;编程领域中的模块化2、模块化规范二、Node.js 中模块化1、Node.js 中模块的分类2、加载模块3、Node.js 中的模块作用域&#xff08;1&#xff09;什么是…

创新!京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了

导言 算法是一门学问&#xff0c;但却总遭到一些程序员的冷落。现在的开发人员&#xff0c;更热衷于编程语言的修炼&#xff0c;以应付面试需求时的需要&#xff0c;所以对算法的学习&#xff0c;稍许忽略了些。实际上&#xff0c;近些年来&#xff0c;各互联网公司对于算法的…

画出一阶系统单位阶跃响应、单位脉冲响应、单位斜坡响应曲线

画出一阶系统单位阶跃响应、单位脉冲响应、单位斜坡响应曲线 t0:0.1:7; num[1]; den[1 1]; figure; c1impulse(num,den,t); plot(t,c1,‘b-’); xlabel(‘t/s’);ylabel(‘c(t)’);grid on; figure; c2step(num,den,t); plot(t,ones(size(t)),‘r-’,t,c2,‘b-’); xlabel(‘t…

Java中File文件操作类的详细使用介绍

文章目录File类的使用File的介绍File常用API判断文件类型-获取文件信息创建文件-删除文件功能遍历文件夹File类的使用 File的介绍 File的概述: File类在包java.io.File下、代表操作系统的文件对象&#xff08;文件、文件夹&#xff09;。 File类提供了诸如&#xff1a;定位文…