自定义BeanNameGenerator生成规则

news2024/11/16 19:01:45

通过点进ComponentScan注解进入源码可以看到

在这里插入图片描述

追随BeanNameGenerator进入源码可以看到该类是个借口且只有一个方法

在这里插入图片描述

点击上面黑色箭头出现两个实现方法在这里插入图片描述

点击第一个方法

在这里插入图片描述

进入determineBeanNameFromAnnotation方法中在这里插入图片描述

通过上诉自定义一个生成beanName方法

  • 先创建一个CustomeBeanNameGenerator类
  • 实现BeanNameGenerator接口
  • 重写generateBeanName方法
public class CustomeBeanNameGenerator implements BeanNameGenerator {

    @Override
    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
        //定义Bean的名称
        String beanName = null;
        //1.判断当前bean的定义信息是否是注解的
        if(definition instanceof AnnotatedBeanDefinition){
           //2.把definition转成注解的bean定义信息
           AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition)definition;
           //2.获取注解Bean定义的元信息
           AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();
           //3.获取定义信息中的所有注解
           Set<String> types = annotationMetadata.getAnnotationTypes();
           //4.遍历types集合
           for(String type : types){
               //5.得到注解的属性
               AnnotationAttributes attributes = AnnotationAttributes.fromMap(annotationMetadata.getAnnotationAttributes(type, false));
               //6.判断attributes是否为null,同时必须是@Component及其衍生注解
               if (attributes != null && isStereotypeWithNameValue(type, annotationMetadata.getMetaAnnotationTypes(type), attributes)) {
                   //7.获取value属性的值
                   Object value = attributes.get("value");
                   //8.判断value属性是否为String类型
                   if (value instanceof String) {
                       String strVal = (String) value;
                       //9.判断value属性是否有值
                       if (StringUtils.hasLength(strVal)) {
                           if (beanName != null && !strVal.equals(beanName)) {
                               throw new IllegalStateException("Stereotype annotations suggest inconsistent " +
                                       "component names: '" + beanName + "' versus '" + strVal + "'");
                           }
                           beanName = strVal;
                       }
                   }
               }
           }
        }
        return beanName != null ? "my"+beanName : "my"+buildDefaultBeanName(definition);
    }

    private static final String COMPONENT_ANNOTATION_CLASSNAME = "org.springframework.stereotype.Component";

    private boolean isStereotypeWithNameValue(String annotationType,
                                                Set<String> metaAnnotationTypes, @Nullable Map<String, Object> attributes) {

        boolean isStereotype = annotationType.equals(COMPONENT_ANNOTATION_CLASSNAME) ||
                metaAnnotationTypes.contains(COMPONENT_ANNOTATION_CLASSNAME) ||
                annotationType.equals("javax.annotation.ManagedBean") ||
                annotationType.equals("javax.inject.Named");

        return (isStereotype && attributes != null && attributes.containsKey("value"));
    }

    private String buildDefaultBeanName(BeanDefinition definition) {
        String beanClassName = definition.getBeanClassName();
        Assert.state(beanClassName != null, "No bean class name set");
        String shortClassName = ClassUtils.getShortName(beanClassName);
        return Introspector.decapitalize(shortClassName);
    }
}

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

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

相关文章

vmware虚拟机centos中/dev/cl_server8/root 空间不够

在使用vmware时发现自己的虚拟机的/dev/cl_server8/root空间不够了&#xff0c;没办法安装新的服务。所以查了一下改空间的办法。 1.在虚拟机关闭的状态下&#xff0c;选中需要扩容的虚拟机->设置->硬件-> 硬盘->扩展->填写扩大到的值。 2.打开虚拟机&#xff…

QT中QSS设置的三种方法

一.什么是QSS QSS称为Qt Style Sheets也就是Qt样式表&#xff0c;它可以应用于Qt部件&#xff08;Widgets&#xff09;和绘制元素&#xff0c;以定制和美化用户界面。QSS大量参考了CSS的内容&#xff0c;只不过QSS的功能比CSS要弱很多&#xff0c; 体现在选择器少&#xff0c…

芯科科技为全球首批原生支持Matter-over-Thread的智能锁提供强大助力,推动Matter加速成为主流技术

智能锁领域的先锋企业U-tec和Nuki选择芯科科技解决方案&#xff0c;成为Matter-over-Thread应用的领先者 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;今…

重拾前端基础知识:CSS

重拾前端基础知识&#xff1a;CSS 前言选择器简单选择器属性选择器组合选择器 插入CSS内嵌样式&#xff08;Inline Style&#xff09;内部样式&#xff08;Internal Style&#xff09;外部样式&#xff08;External Style&#xff09; 层叠颜色背景颜色文本颜色RGB 颜色HEX 颜色…

SpringBoot源码解读与原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自动装配

文章目录 前言第13章 SpringBoot整合WebFlux13.1 响应式编程与Reactor13.1.1 命令式与响应式13.1.2 异步非阻塞13.1.3 观察者模式13.1.4 响应性13.1.5 响应式流13.1.6 背压13.1.7 Reactor13.1.7.1 Publisher13.1.7.2 Subscriber13.1.7.3 Subscription13.1.7.4 Processor13.1.7.…

RuoYi-Vue-Plus功能分析-jackson配置

文章目录 前言一、配置文件二、配置类三、注解四、json工具类1. 工具内容2. 使用工具 前言 前端在给我发送请求的时候一般包含三个部分url&#xff0c;header&#xff0c;body。那么就会涉及我们后端如何接收这些请求参数并且我们处理完毕参数后前端又如何接收参数 通过url传…

源码解析篇 | YOLOv8官方源码项目目录结构解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv8是一种目标检测算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的第8个版本。YOLOv8相比于之前的版本&#xff0c;在检测精度和速度上都有所提升&#xff0c;它在各种场景下都表现出色…

初阶数据结构:栈与队列

目录 1. 简述&#xff1a;栈2. 栈的功能分析与实现2.1 功能分析2.2 栈的实现2.2.1 栈的结构创建与初始化2.2.2 压栈&#xff0c;出栈与判空&#xff1a;2.2.3 获取栈顶元素&#xff0c;检索栈的长度与栈的销毁 3. 简述&#xff1a;队列4. 队列的功能分析与实现4.1 队列的功能分…

基于springboot+vue的美食推荐商城

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

重塑计算:ICP 打造无限智能合约云解决方案

作者&#xff1a;Lynn Cadet 编译&#xff1a;TinTinLand 原文&#xff1a;https://www.hostingadvice.com/blog/internet-computer-offers-a-limitless-smart-contract-cloud-solution/ 摘要&#xff1a;与其前身互联网一样&#xff0c;区块链行业寻求引领一个新时代及其经济…

腾讯云优惠券一共有3个渠道可以领取,你知道吗?

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

Ubuntu22.04下安装Spark2.4.0(Local模式)

一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚拟机版本&#xff1a;17.0.0 build-20800274 ISO映像文件&#xff1a;ubuntukylin-22.04-pro-amd64.iso Hadoop版本&#xff1a;Hadoop 3.1.3 JDK版本&#xff1a;Java JDK 1.8 Spark版本&#xff1a;S…

1905_ARMv7-M的堆栈寄存器

1905_ARMv7-M的堆栈寄存器 全部学习汇总&#xff1a; g_arm_cores: ARM内核的学习笔记 (gitee.com) ARMv7-M实现了2种堆栈&#xff0c;分别是MSP和PSP。复位的时候默认是MSP&#xff0c;而当前是哪种可以通过CONTROL.SPSEL寄存器的bit来查看。 SP寄存器的最低2bit&#xff0c;S…

叠氮生物素,Biotin-azide ,含有生物素基团和叠氮基团

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;生物素-叠氮&#xff0c;生物素叠氮&#xff0c;叠氮生物素&#xff0c;Biotin-azide &#xff0c;Azide-Biotin&#xff0c;Biotin-N3&#xff0c;N3-Biotin&#xff0c;908007-17-0 一、基本信息 【产品简介】&a…

根据二层封装协议决定—网络类型

目录 一、网络类型的分类 二、数据链路层协议 MA网络 以太网协议 P2P网络 一、网络类型的分类 P2P --- point to point --- 点到点网络 MA --- Multi-Access Network --- 多点接入网络 BMA --- Broadcast Multi-Access Network --- 广播型多点接入网络 NBMA --- Non-Bro…

如何更好的引导大语言模型进行编程的高效开发流程?

这张图片展示了一种如何更好地引导大语言模型进行编程的方法。 首先&#xff0c;最简单也是最有效的方法是让大语言模型重复运行多次&#xff0c;每次增加一些额外的信息&#xff0c;直到获得想要的结果。这种方法虽然简单&#xff0c;但可能需要多次尝试才能得到满意的结果。…

AI搜索工具颠覆百度搜索,直接给出结果

这可能是一款足够颠覆搜索引擎的AI工具&#xff0c;绝对是AI产品中的国货之光。 它就是秘塔AI搜索&#xff0c;主打的亮点就是没有广告&#xff0c;我们进入官网之后&#xff0c;可以在对话框输入我们想要了解的事件。 比如最近比较热门的是中国AI教父李一舟&#xff0c;它会执…

netlink原理及应用

什么是netlink netlink是一种基于网络的通信机制&#xff0c;允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信&#xff1b;netlink的主要作用是内核与用户态之间通信&#xff1b;它的思想是&#xff0c;基于BSD的socket使用网络框架在内核和用户态之间进行通信…

Python算法题集_括号生成

Python算法题集_括号生成 题22&#xff1a;括号生成1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【堆栈回溯】2) 改进版一【切片回溯】3) 改进版二【列表缓存逐层扩充】 4. 最优算法5. 相关资源 本文为Python算法题集之一的代码示例 题22&am…

#单片机(TB6600驱动42步进电机)

1.IDE:keil 2.设备:保密 3.实验&#xff1a;使用单片机通过普通IO口控制TB6600驱动42步进电机 4.时序图&#xff1a; TB6600 ENA、ENA-DIR-、DIRPUL-、PULB-、BA、A-VCC、GND使能电机&#xff08;直接悬空不接&#xff09;方向脉冲输入&#xff08;普通IO口模拟即可&#xff…