【Spring】透过Spring源码查看Bean的命名转换规则

这篇具有很好参考价值的文章主要介绍了【Spring】透过Spring源码查看Bean的命名转换规则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Spring】透过Spring源码查看Bean的命名转换规则

【Spring】透过Spring源码查看Bean的命名转换规则

近期在写Spring项目的时候,需要通过注解的形式去替代之前直接将Bean存放在Spring容器这种方式,以此来简化对于Bean对象的操作,但是这样无法通过准确的Id去获取到相应的Bean对象了

测试观察

  • 首先,如果要将指定的对象存放到Spring中,在Spring的配置文件中的扫描包路径一定不能错,这样我们在这个包中所包含的类前加上【五大类注解】,就可以将对象存储到Spring中的
<content:component-scan base-package="com.spring.demo"></content:component-scan>

【Spring】透过Spring源码查看Bean的命名转换规则

  • 然后我便在这个包下写了个UserController 类,并且加上了【@Controller】注解,此时Spring在加载的时候就会存储改对象
@Controller
public class UserController {
    public void SayHello(){
        System.out.println("do SayHello()");
    }
}
  • 此时看到,我在App类中去获取到了这个Bean对象,而且使用的是【名称 + 类名】的形式,这种形式就可以防止Spring中存储多个Bean对象而造成的冲突问题
  • 但是呢,我就卡在了这里,不知道该去写什么名称?因为根本没有在Spring中写明Id值

【Spring】透过Spring源码查看Bean的命名转换规则

  • 首先我想到的是这个名称会不会就是类名呢?但是在我进行尝试之后却发现并不是这样,编译器报出了异常说No bean named 'UserController' available

【Spring】透过Spring源码查看Bean的命名转换规则

  • 然后我又想到了Java的命名规范是【小驼峰】,一般去通过这个类实例化对象的时候都是将首字母进行一个小写,其余不变,于是当我使用这个名称进行传递的时候,程序运行就没有问题了

【Spring】透过Spring源码查看Bean的命名转换规则

那我首先猜测它的命名就是这样规定的,但是有没有特例呢?

  • 此时我又去定义了一个类,将其类名取成了两个大写字母开头的,看看这样子的命名是否还会以【小驼峰】的形式去进行转换
@Controller
public class SController {
    public void SayHello(){
        System.out.println("do SayHello()");
    }
}
  • 但是当我在看运行结果的时候,却发现这样小驼峰的形式似乎行不通了

【Spring】透过Spring源码查看Bean的命名转换规则

  • 但是当我在将名称改回【类名】的时候,却发现又可以运行了,这是为什么呢?里面的转换规则又是怎样的?这需要我再去研究一番🔍

【Spring】透过Spring源码查看Bean的命名转换规则

原理探究

通过上面的测试可以看出,Spring对于这个Bean对象的命名转换是存在一定规则的,因为【在Spring中,约定大于俗成】

  • 接下去我就通过查看Spring源码的方式带读者来探究一下到底这个Spring内部对于这个Bean的命名转换规则是怎样的,虽然Spring框架的代码都是开源的,但是要精准地找到对应想要的代码逻辑可不简单,需要层层深入地进行探访
  1. 首先第一步,我们可以按两下【shift】键,便会跳出IDEA的搜索框,在这个里面你可以去搜寻当前项目中所有的类、接口,以查看它们的内部实现。然后我便发现了一个类叫做AnnotationBeanNameGenerator,翻译一下即为【注释Bean名称生成器】,那我猜测命名规范的代码逻辑可能就在这个类中

【Spring】透过Spring源码查看Bean的命名转换规则

  1. 当我们进入到这个类后,就可以去寻找其对应的方法了,那个方法是和BeanName有关联的,首先点击右侧的【结构】我们便可以看到这个类中到底有哪些方法,那一看我们就可以观察到有generateBeanName()这个方法,点到对应的方法后再进行观察,便发现其最后返回时又去调用了一个方法,于是我继续按住Ctrl键点进去

【Spring】透过Spring源码查看Bean的命名转换规则

  • 点进去发现里面又是一个方法,一些复杂的逻辑其实就是以这样一种嵌套的形式进行的,各个类、接口之间的方法调来调去

【Spring】透过Spring源码查看Bean的命名转换规则

  • 然后看到这是下面的这个方法buildDefaultBeanName()生成默认Bean名称

【Spring】透过Spring源码查看Bean的命名转换规则

  • 最后的话我们看到它在return的时候似乎又通过一个类名去调用了一个方法,然后传入了这个ClassName,那我继续点进去后就发现我似乎已经不处于Spring框架的源码中了,而是来到了JDK中
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);
}
  • 我们可以点击右上角的这个按钮【选择打开的文件】去找到这个类所对应的位置

【Spring】透过Spring源码查看Bean的命名转换规则

  • 最后我这边顺腾摸瓜地去查找就看到这个类是java.deskop包下的一个类,那么我们在查看Spring源码的时候最终还是来到了JDK下,这个可以说明一点:Bean的命名并不是乱取的,而是使用JDK的一个命名标准去进行命名的

【Spring】透过Spring源码查看Bean的命名转换规则

然后我们就可以去看看JDK中对于命名的规范到底是怎样的💻

  • 可以看到很明显的这里是有两种情况,若是首字母和第二个字母都是大写的话,那就返回原来的名称;第二种情况则是将字符串首先转换成了字符数组,然后再将第一位变成小写
  • 那看到这里的话其实我已经是明白了,原来Spring对于Bean的这个命名规则是这样的

【Spring】透过Spring源码查看Bean的命名转换规则

总结一下

最后的话我们来总结一下本次查看源码的收获吧🍚

通过查看Spring的源码我们进入到了JDK中,经过代码的阅读将Bean的命名转换总结了以下两点

  1. 默认情况:使用原类名首字母小写就能读取到Bean对象
  2. 特例:如果首字母和第二字母都是大写的情况下,那么Bean名称就是原类名

在学习Spring框架的过程中,初学者难免会遇到不理解的地方,因为Spring是一个IoC容器,会通过DI依赖注入的形式帮我们自动地去管理对象,所以内部的细节便不得而知,但我们可以通过【阅读源码】的方式来进行理解,去看看大佬是怎么思考的🤔

【Spring】透过Spring源码查看Bean的命名转换规则文章来源地址https://www.toymoban.com/news/detail-469986.html

到了这里,关于【Spring】透过Spring源码查看Bean的命名转换规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring源码:Bean生命周期(三)

    在之前的文章中,我们已经对 bean 的准备工作进行了讲解,包括 bean 定义和 FactoryBean 判断等。在这个基础上,我们可以更加深入地理解 getBean 方法的实现逻辑,并在后续的学习中更好地掌握 createBean 方法的实现细节。 讲解getBean方法之前,我们先来看看他有几种常见的用法:

    2024年02月02日
    浏览(35)
  • Spring源码:Bean生命周期(终章)

    本系列前面讲解了Spring的bean定义、bean实例化、bean初始化等生命周期。这些步骤使我们能够了解bean从创建到准备好使用所经历的过程。但是,除了这些步骤,bean的销毁也是非常重要的一步。在本系列的最后,我们将深入探讨bean的销毁过程,包括在什么情况下会发生销毁、销

    2024年02月06日
    浏览(37)
  • Spring源码:Bean生命周期(五)

    在上一篇文章中,我们深入探讨了 Spring 框架中 Bean 的实例化过程,该过程包括从 Bean 定义中加载当前类、寻找所有实现了 InstantiationAwareBeanPostProcessor 接口的类并调用实例化前的方法、进行实例化、调用 applyMergedBeanDefinitionPostProcessors 方法等多个步骤,最终生成了一个真正的

    2024年02月04日
    浏览(30)
  • Spring5学习随笔-生命周期、自定义类型转换器、后置处理Bean

    学习视频:【孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索。学不会Spring?只因你未遇见孙哥】 指的是一个对象创建、存活、消亡的一个完整过程 由Spring负责对象的创建、存活、销毁,了解生命周期,有利于我们使用好Spring为我们创建

    2024年02月05日
    浏览(49)
  • 【框架源码】Spring源码解析之Bean生命周期流程

    观看本文前,我们先思考一个问题,什么是Spring的bean的生命周期?这也是我们在面试的时候,面试官常问的一个问题。 在没有Spring之前,我们创建对象的时候,采用new的方式,当对象不在被使用的时候,由Java的垃圾回收机制回收。 而 Spring 中的对象是 bean,bean 和普通的 J

    2024年02月09日
    浏览(31)
  • Spring之Bean生命周期源码解析

    ClassPathBeanDefinitionScanner.java ClassPathScanningCandidateComponentProvider.java 通过组件索引寻找 这里的 componentsIndex 在初始化的时候会尝试解析 META-INF/spring.components 文件中的配置信息 把断点打在 ClassPathScanningCandidateComponentProvider 的 setResourceLoader 方法上调试可以看到堆栈 可以看到,的确

    2024年02月11日
    浏览(37)
  • 【Spring源码】讲讲Bean的生命周期

    面试官:“看过Spring源码吧,简单说说Spring中Bean的生命周期” 大神仙:“基本生命周期会经历实例化 - 属性赋值 - 初始化 - 销毁”。 面试官:“......” 如果是普通Bean的生命周期,那么上述的回答是真正确的。确实会经历“实例化 - 属性赋值 - 初始化 - 销毁”四个阶段。但

    2023年04月09日
    浏览(24)
  • Spring源码:bean的生命周期(一)

    本节将正式介绍Spring源码细节,将讲解Bean生命周期。请注意,虽然我们不希望过于繁琐地理解Spring源码,但也不要认为Spring源码很简单。在本节中,我们将主要讲解Spring 5.3.10版本的源代码。如果您看到的代码与我讲解的不同,也没有关系,因为其中的原理和业务逻辑基本相

    2024年02月02日
    浏览(27)
  • Spring源码:Bean的生命周期(二)

    让我们继续讲解Spring的Bean实例化过程。在上一节中,我们已经讲解了Spring是如何将Bean定义加入到IoC容器中,并使用合并的Bean定义来包装原始的Bean定义。接下来,我们将继续讲解Spring的 getBean() 方法,特别是针对 FactoryBean 的解析。 在 getBean() 方法中,Spring还支持对 FactoryBea

    2024年02月02日
    浏览(25)
  • spring高级源码50讲-1-8(spring容器与bean)

    1) 容器接口 BeanFactory 接口,典型功能有: getBean ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能,如: 国际化 通配符方式获取一组 Resource 资源 整合 Environment 环境(能通过它获取各种来源的配置信息) 事件发布与监听,实现组件之间的解耦 可以

    2024年02月10日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包