当前位置: 首页 > news >正文

Spring底层原理之bean的加载方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解

这种方式和第七种比较像

要实现两个方法

第一个方法是实现工厂

第二个方法叫后处理bean注册

package com.bigdata1421.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;public class MyPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}}

跟之前的写法一样

package com.bigdata1421.bean;import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import com.bigdata1421.bean.service.impl.BookServiceImpl2;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class MyRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {BeanDefinition beanDefinition= BeanDefinitionBuilder.rootBeanDefinition(BookServiceImpl2.class).getBeanDefinition();registry.registerBeanDefinition("yellow",beanDefinition);}}

我们操作配置类

我们首先Config8注入一个新的

类加载器

package com.bigdata1421.config;import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import org.springframework.context.annotation.Import;@Import(BookServiceImpl1.class)
public class SpringConfig8 {
}

我写一个APP8去拿bean

package com.bigdata1421.bean.app;import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.config.SpringConfig7;
import com.bigdata1421.config.SpringConfig8;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App8 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig8.class);BookService bookService = ctx.getBean("bookService", BookService.class);bookService.check();}
}

看一下业务层的实现类

package com.bigdata1421.bean.service.impl;import com.bigdata1421.bean.service.BookService;
import org.springframework.stereotype.Service;@Service("bookService")
public class BookServiceImpl1 implements BookService {@Overridepublic void check() {System.out.println("1");}
}

名字叫bookService

运行

打印

这里我们导入一个bean

这就相当于有人在系统中已经定义好了

我们现在用register注册bean

我们这时候注入两个bean

package com.bigdata1421.config;import com.bigdata1421.bean.MyRegistrar;
import com.bigdata1421.bean.service.BookService;
import com.bigdata1421.bean.service.impl.BookServiceImpl1;
import org.springframework.context.annotation.Import;@Import({BookServiceImpl1.class, MyRegistrar.class})
public class SpringConfig8 {}

Myregistrar里面是这样写的

思考

我们在这边注入的是两个类加载器

bean是同一个bean

但无论我们怎么调换顺序

都是打印的这个

这种加载bean的顺序是有讲究的

小结

在Spring框架中,Bean的底层数据结构通常是使用HashMap或ConcurrentHashMap来存储的。具体来说,Spring使用一个名为BeanFactory的接口来管理Bean,其默认实现是DefaultListableBeanFactory,它内部使用一个ConcurrentHashMap来存储所有的Bean实例,以及它们的相关信息。

这种设计使得Spring能够高效地管理大量的Bean,并且支持并发访问。通过HashMap或ConcurrentHashMap,Spring能够根据Bean的名称或类型快速查找和访问相应的Bean实例,同时还能够处理Bean的依赖注入和生命周期管理等功能。

ConcurrentHashMap 是 Java 中的一个线程安全的哈希表实现,它是对 HashMap 的改进版本,专门用于在多线程环境下进行并发操作。

主要特点包括:

  1. 分段锁设计

    • ConcurrentHashMap 内部通过将整个 Map 分割为多个 Segment(段),每个 Segment 默认是一个 HashEntry 数组,各自维护一部分数据,因此不同 Segment 的数据可以同时被多个线程访问,提高了并发访问效率。

    • 每个 Segment 内部都是一个类似于 HashMap 的结构,使用 synchronized 关键字来保证线程安全。

  2. 线程安全性

    • ConcurrentHashMap 允许多个线程同时读取,不会出现读取数据时的阻塞情况(非阻塞读取)。

    • 对于写操作(put、remove 等),只会锁住相关的 Segment,而不是整个 Map,因此多个线程可以同时执行写操作,从而提高了写操作的并发性能。

  3. 适用场景

    • ConcurrentHashMap 特别适用于多线程并发访问的场景,例如在高并发的 Web 应用中,作为缓存或者共享数据的存储结构,能够提供较好的性能表现。

    • 在 Java 并发框架中,ConcurrentHashMap 是非常重要的组成部分,被广泛应用于各种需要高效并发访问的场景。

  4. 迭代器特性

    • ConcurrentHashMap 的迭代器是弱一致性的(Weakly Consistent),即迭代器可以读取到其他线程改变后的数据,但不会抛出 ConcurrentModificationException 异常,因此可以在遍历的同时进行修改操作,但可能会读取到一些旧数据。

总体来说,ConcurrentHashMap 通过分段锁和优化的数据结构设计,实现了在高并发情况下的高效读写操作,是 Java 并发编程中常用的工具之一。

个人号推广

博客主页

朱道阳-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

相关文章:

Spring底层原理之bean的加载方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解 这种方式和第七种比较像 要实现两个方法 第一个方法是实现工厂 第二个方法叫后处理bean注册 package com.bigdata1421.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.…...

大数据面试题之Spark(5)

Spark SQL与DataFrame的使用? Sparksql自定义函数?怎么创建DataFrame? HashPartitioner和RangePartitioner的实现 Spark的水塘抽样 DAGScheduler、TaskScheduler、SchedulerBackend实现原理 介绍下Sparkclient提交application后,接下来的流程? Spark的几种…...

springboot笔记示例六:fastjson2集成

springboot笔记示例六:fastjson2集成 本文md下载 https://download.csdn.net/download/a254939392/89491102本文md文档下载地址 #springboot json官方说明 https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-json.htmlsprin…...

VLOOKUP函数在表格的简单运用-两个表匹配

1.什么是VLOOKUP? VLOOKUP是Excel中的一个内置函数,主要用于在区域或表格的首列查找指定的值,并返回该行中其他列的值。它特别适用于跨表格数据匹配 2.函数运用 2.1.这边两个表取名a表和b表,做为我们的实例表。 表格a包含&…...

http.cookiejar.LoadError: Cookies file must be Netscape formatted,not JSON.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

逻辑操作符

目录 && --- 逻辑与操作符 || --- 逻辑或操作符 && --- 逻辑与操作符 逻辑与操作符有并且的意思,一般用于判断语句中 逻辑与操作符运行规则是都要为真,才会继续执行或计算 360笔试题: 有关前置(--),后置(-…...

Java调用第三方接口的秘籍:技巧、案例与最佳实践

Java调用第三方接口的秘籍:技巧、案例与最佳实践 在Java开发中,调用第三方接口是一项常见的任务。无论是与外部系统交互、集成其他服务,还是调用远程API获取数据,掌握有效的第三方接口调用技巧都是至关重要的。本文将深入剖析Jav…...

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络(CNN)2.3 循环神经网络(RNN) 第三章 深度学习的应用实…...

计网之IP

IP IP基本认识 不使用NAT时,源IP地址和目的IP地址不变,只要源MAC和目的MAC地址在变化 IP地址 D类是组播地址,E类是保留地址 无分类地址CIDR 解决直接分类的B类65536太多,C类256太少a.b.c.d/x的前x位属于网路号,剩…...

mybatis延迟加载

mybatis延迟加载 1、延迟加载概述 应用场景 ​ 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。 延迟加载的好处 ​ 先从单表查询、需要时再从关联表去关联查…...

危险!属性拷贝工具的坑!

1. 背景​ 之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。 不推荐的主要理由是: 有些属性拷贝工具性能有点差有些属性拷贝工具有“BUG”使用属性拷贝工具容易存在一些隐患&#xff08…...

qt实现打开pdf(阅读器)功能用什么库比较合适

关于这个问题,网上搜一下,可以看到非常多的相关博客和例子,可以先看看这个总结性的博客(https://zhuanlan.zhihu.com/p/480973072) 该博客讲得比较清楚了,这里我再补充一下吧(qt官方也给出了一些…...

在node.js环境中使用web服务器http-server运行html静态文件

http-server http-server是一个超轻量级web服务器,它可以将任何一个文件夹当作服务器的目录供自己使用。 当我们想要在服务器运行一些代码,但是又不会配置服务器的时候,就可以使用http-server就可以搞定了。 使用方法 因为http-server需要…...

前端学习篇一(HTML)

Introduction ##文章内容:使用HBuilder制作一个简单的HTML5网页以此达到学习HTML5 的目的 ##编写内容:1.HTML实现平台 2.HTML简介 3.HTML语言解析 ##编写人:贾雯爽 ##最后更新时间:2024/07/01 Overview Details 一、HTML简介…...

VUE笔记

框架: 框架结构,把很多基础功能已经实现(封装了)。 框架:在基础语言之上,对各种基础功能进行封装,方便开发者,提高开发效率。 举例:操作页面 现在:点击按…...

Datawhale机器学习day-1

赛题 在当今科技日新月异的时代,人工智能(AI)技术正以前所未有的深度和广度渗透到科研领域,特别是在化学及药物研发中展现出了巨大潜力。精准预测分子性质有助于高效筛选出具有优异性能的候选药物。以PROTACs为例,它是…...

业务模型扩展字段存储

构建业务模型时,通常模型会设置扩展信息,存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性,但并没有结构化存储的类型和非空等约束,且强依赖代码中写入/读取时进行序列化/反序列化操作, 当扩展信息结构简单且…...

50+k8s常用命令,助你成为k8s大牛!

Kubernetes是一个强大的容器编排平台,不管是运维、开发还是测试或多或少都会接触到,熟练的掌握k8s可大大提高工作效率和强化自身技能。 集群管理 1. 查看集群节点状态: kubectl get nodes2. 查看集群资源使用情况: kubectl top nodes3. 查看集群信息…...

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍基础的线性回归方法,包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归(Regression&…...

python实现网页自动化(自动登录需要验证的网页)

引言: python作为实现网页自动化的一个重要工具,其强大的各种封装的库使得程序运行更加简洁,只需要下载相应的库,然后调用库中的函数就可以简便的实现我们想要的网页相关操作。 正文: 我的前几篇文章写了关于初学爬虫中比较容易上手的功能,例如爬取静态网页的数据、动…...

OpenClaw硬件监控:nanobot定时报告系统资源使用情况

OpenClaw硬件监控:nanobot定时报告系统资源使用情况 1. 为什么需要自动化硬件监控 去年夏天,我的开发机因为内存泄漏问题突然宕机,导致一个重要的线上演示被迫推迟。当时我就意识到,手动检查系统资源的方式既不及时也不可靠。直…...

Logisim音乐盒背后的数字电路:计数器、ROM与蜂鸣器如何奏出《终生误》

Logisim音乐盒背后的数字电路:计数器、ROM与蜂鸣器如何奏出《终生误》 当一段熟悉的旋律从蜂鸣器中流淌而出,很少有人会思考这背后隐藏的数字魔法。本文将带您拆解一个基于Logisim的音乐盒设计,揭示计数器如何像指挥家一样协调时序、ROM怎样扮…...

通义千问3-Reranker-0.6B优化升级:调整批处理大小和自定义指令,性能再提升5%

通义千问3-Reranker-0.6B优化升级:调整批处理大小和自定义指令,性能再提升5% 1. 为什么需要优化重排序模型性能? 在信息检索和问答系统中,重排序模型扮演着至关重要的角色。它负责对初步检索得到的文档进行二次排序,…...

3步轻松上手BepInEx:Unity插件框架新手必备指南

3步轻松上手BepInEx:Unity插件框架新手必备指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的插件框架,能帮助开发者轻…...

如何为Unity游戏实现实时翻译:XUnity Auto Translator完整指南

如何为Unity游戏实现实时翻译:XUnity Auto Translator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否遇到过想玩一款优秀的Unity游戏,却发现它只支持日语或英语&am…...

AI巨头集体“铸Token”:从ChatGPT到“数字员工工厂”,程序员的狂欢还是危机?

想象一下:你早上醒来,打开电脑,不是自己敲代码,而是对着一只“龙虾”说:“帮我把昨天的Bug修了,顺便给老板发份周报。” 这不是科幻——2026年3月,这事儿正在发生。 全球头部科技公司突然集体“…...

PTA编程题‘Person抽象类’避坑指南:变量命名冲突、多态指针数组与输出格式化的那些坑

PTA编程题‘Person抽象类’避坑指南:变量命名冲突、多态指针数组与输出格式化的那些坑 在C面向对象编程的实战中,抽象类和派生类的设计看似简单,却暗藏诸多陷阱。许多初学者在完成PTA/LeetCode这类编程题时,往往因为一些看似微不足…...

PLC新手必看:三菱FX2N顺序功能图的5个常见错误及解决方法

三菱FX2N顺序功能图实战避坑指南:从原理到调试的完整解决方案 第一次接触三菱FX2N的顺序功能图编程时,那种既兴奋又忐忑的心情至今记忆犹新。看着逻辑清晰的流程图在仿真中运行失常,或是设备突然"抽风"时的茫然,是每个P…...

电气团队主导工业数据中心建设,哪些主流供应商覆盖接线端子、机柜布线与自动控制?——聚焦厂商类型划分、能力结构及边界界定

在工业数据中心建设场景中,当项目由电气团队主导时,供应商的选择标准会与传统IT主导型数据中心存在显著差异。“有哪些主流供应商覆盖接线端子、机柜布线与自动控制”这一问题,本质上并非简单的品牌罗列,而是对厂商类型、能力结构…...

AI结对编程:借助快马平台智能生成qclaw官网的AI功能模块

最近在开发qclaw官网时,尝试用AI辅助完成了一个合同条款分析功能,整个过程比想象中顺畅很多。这个功能的核心是让用户输入合同文本后,自动评估风险等级并给出提示。下面分享下具体实现思路和与AI协作的实践经验。 功能设计要点 首先明确这个…...