spring beanname是如何生成的, 他的生成规则是什么?

news/2024/10/25 13:14:40/

付出努力但失败,是仅次于付出努力并成功的,世上第二棒的事

debug 走起

org.springframework.context.annotation.ComponentScanAnnotationParser#parse

Class<? extends BeanNameGenerator> generatorClass = componentScan.getClass("nameGenerator");boolean useInheritedGenerator = (BeanNameGenerator.class == generatorClass);scanner.setBeanNameGenerator(useInheritedGenerator ? this.beanNameGenerator :BeanUtils.instantiateClass(generatorClass));

org.springframework.context.annotation.ConfigurationClassParser#ConfigurationClassParser

->

org.springframework.context.annotation.ConfigurationClassPostProcessor#componentScanBeanNameGenerator

@Overridepublic String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {if (definition instanceof AnnotatedBeanDefinition) {String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);if (StringUtils.hasText(beanName)) {// Explicit bean name found.return beanName;}}// Fallback: generate a unique default bean name.return buildDefaultBeanName(definition, registry);}

通过接口 AnnotatedBeanDefinition 判断是否是有注解的

我们这里是 ScannedGenericBeanDefinition

正是实现了 AnnotatedBeanDefinition 的类,

用接口判断这个真是妙呀,

不用再去通过反射获取注解信息判断, 真是强呀

然后通过 determineBeanNameFromAnnotation 注解方法获取到component注解是否自定义了名字

其实只要定义以下标签都可以

protected 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"));}

最后没办法没有配置, 默认使用 buildDefaultBeanName 生成默认的方法

protected 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);}

decapitalize 方法实现

public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;}char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);}

获取字符串并将其转换为普通 Java 变量名称大写的实用程序方法。这通常意味着将第一个字符从大写转换为小写,但在特殊情况下,当有多个字符而且第一个和第二个字符都是大写时,类名就是BeanName。因此,“FooBah”变成了“fooBah”,“X”变成了“x”,但“URL”仍然是“URL”。


http://www.ppmy.cn/news/38492.html

相关文章

如何让 ChatGPT 充当细致入微的 Java 代码优化工? | 得物技术

注&#xff1a;本文使用 New Bing&#xff08;GPT4.0&#xff09;演示 让他扮演一个 Java 软件开发者 第一步&#xff1a;我们让 ChatGPT 扮演一个 Java 软件开发者的角色 提示词插件&#xff1a;地址&#xff1a;ChatGPT BingChat GPT3 Prompt Generator App (Streamlit) - a…

计算机信息安全有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是计算机信息安全方向的SCI期刊推荐&#xff1a; IEEE Transactions on Information Forensics and Security 该期刊主要发表信息安全和数字取证方面的原创性研究&#xff0c;包括数据安全、网络安全、身份认证、加密、信息隐藏等领域的研究成果。该期刊的影响因子为8.134…

数仓第七章作业

数仓第七章作业 文章目录 数仓第七章作业一、第七章课后作业第三题第四题第五题第六题第七题二、问题一、第七章课后作业 第三题 设有10个二元属性,3个数据对象的数据集。 idA1A2A3A4A5A6A7A8A9A10X110111

海尔智家参与国家工信部产业技术基础服务平台项目顺利通过验收

01 海尔智家参与国家工信部 产业技术基础服务平台项目 顺利通过验收 3月28日&#xff0c;由中国质量认证中心牵头&#xff0c;海尔智家、中国家用电器协会等共同承担的国家工业和信息化部“面向智能家电芯片、传感器与物联网模块等关键部件及家电互联的产业技术基础服务平台…

蓝桥杯·3月份刷题集训Day07

本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训&#xff0c;同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉&#x1f4aa;。 文…

java获取视频时长

1、先导包 <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>2.6.0</version> </dependency>2、获取时长 Testpublic void test01() {long time 0;try {String url "http://…

算法竞赛进阶指南0x37 容斥原理与莫比乌斯函数

算法竞赛进阶指南0x37 容斥原理与莫比乌斯函数

【华为机试真题详解JAVA实现】—统计每个月兔子的总数

目录 一、题目描述 二、解题代码 一、题目描述 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子,假如兔子都不死,问第n个月的…