返回顶部
首页 > 资讯 > 后端开发 > Python >详解关于spring bean名称命名的那些事
  • 297
分享到

详解关于spring bean名称命名的那些事

2024-04-02 19:04:59 297人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言02源码查看01从main方法直接调试断点02带着问题查看,靠猜加验证的方式03源码验证04总结前言 用了多年spring,一直想当然把spring默认的beanName当成

前言

用了多年spring,一直想当然把spring默认的beanName当成是类名的首字母小写,比如HelloService其beanName为helloService。直到有天对接了供方厂商的接口,他有个类形如ABService,于是用


getBean(“aBService”)

的方式获取bean,结果取到是null,一开始以为是ABservice没注入,后面采用


getBean(ABService.class)

能成功获取到bean,说明ABService是有注入到ioc容器中,但是为啥用aBService获取不到bean?于是就用如下代码段,打印出相应ABService对应的beanName


applicationContext.getBeansOfType(ABService.class).forEach((beanName,bean)->{
            System.out.println(beanName + ":" + bean);
        });

打印出来的结果,如下

ABService:com.GitHub.lybgeek.ABService@245b6b85

beanName竟然是ABService,这就和之前的想当然有出入。于是只好查看源码

02源码查看

源码查看有2种方式,本文的示例是SpringBoot项目

01从main方法直接调试断点

从图可以看出如果是以扫描注解注入形式,其beanName的生成规则是由


org.springframework.context.annotation.AnnotationBeanNameGenerator#generateBeanName

决定。

ps: 这种直接从main启动类调试起,比较适用于时间比较多,或者排查毫无头绪

02带着问题查看,靠猜加验证的方式

利用idea的find Usage查找引用,比如ABService的注解@service,我们可以直接查看哪个引用到@Service,再猜测下beanName的生成规则

通过猜,我们基本上就可以定位出比较符合我们需求的方法

03源码验证

从上面的分析,我们可以知道如果是扫描bean注解注入的方式,其生成beanName规则,是在


org.springframework.context.annotation.AnnotationBeanNameGenerator

其生成规则代码如下


@Override
  public 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);
  }

从代码段,我们可以看出,注解上有取名,比如@Service(“abService”),则beanName为abService,如果没有取名,则看


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


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

其实从代码我们就很容易看出答案了,如果类名前两个或以上个字母都是大写,则beanName和类名就一样了,不会进行首字母小写转换。

decapitalize这个方法的注释也写得很清楚,注释如下




04总结

通过扫描bean注解注入IOC时,如果不指定bean名称的默认规则是类名的首字母小写,如果类名前两个或以上个字母都是大写,那么bean名称与类名一样。

其实这个细节可能懂的都懂,本文的彩蛋主要是分享一下平时查看源码的一点心得吧,哈哈

到此这篇关于spring bean名称命名的文章就介绍到这了,更多相关spring bean名称命名内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解关于spring bean名称命名的那些事

本文链接: https://lsjlt.com/news/130149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解关于spring bean名称命名的那些事
    目录前言02源码查看01从main方法直接调试断点02带着问题查看,靠猜加验证的方式03源码验证04总结前言 用了多年spring,一直想当然把spring默认的beanName当成...
    99+
    2024-04-02
  • 关于spring5的那些事:@Indexed 解密
    目录哪些资源会被索引?如何使用?原理随着云原生的发展,很多技术会被重新掂量,重新定义,历来技术的发展也是遵循天时地利,以其势尽享其利。再云原生下,jdk的最大的问题在于笨重(几百mb...
    99+
    2024-04-02
  • 基于spring同名bean覆盖问题的解决
    目录spring同名bean覆盖问题分为两种情况处理案例如下spring 子类覆盖父类中注入的bean抽象基类另外一个抽象基类controllerspring同名bean覆盖问题 默...
    99+
    2024-04-02
  • 详细聊聊关于Mysql联合查询的那些事儿
    目录联合查询之union 1. 查询中国各省的ID以及省份名称 2. 湖南省所有地级市ID、名字 3. 用union将他们合并 联合查询之union a...
    99+
    2024-04-02
  • 关于java中变量命名规范的详细介绍
    Java是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成...
    99+
    2019-10-05
    java入门 java 变量 命名规范 介绍
  • jQuery中绑定事件的命名空间详解
    在没有看到这篇 文章之前,我一直不知道原来bind也可以有命名空间。事实上,我看完这篇文章后,再去翻了一下手册,也才发现了一点点的注释。但手册也仅仅是一句话就带 过去了。没有过多的深...
    99+
    2022-11-21
    jQuery 绑定事件
  • 关于Spring中一级缓存、二级缓存和三级缓存的那些事
    目录题记缓存作用分析一级缓存、二级缓存、三级缓存区别是什么总结题记 常常听到别人提起:“一级缓存、二级缓存、三级缓存”。那么它们是什么呢?有什么作用呢? 缓存...
    99+
    2024-04-02
  • 关于Spring中声明式事务的使用详解
    目录一、前言 二、回顾JDBC的数据库事务 三、数据库事务隔离级别 3.1 数据库事务的基本特征3.2 详解数据库隔离级别 3.2.1 未提交读 3.2.2 读提交 3.2.3 可重...
    99+
    2024-04-02
  • python命名关键字参数的作用详解
    1、说明 *,nkw表示命名关键字参数,是用户想输入的关键字参数名称,定义方式是在nkw前追加*, 2、作用 限制调用者传达的参数名称。 3、实例 # 命名关键字参数 def p...
    99+
    2024-04-02
  • 关于Spring MVC同名参数绑定问题的解决方法
    前言最近在使用Spring MVC接收参数的时候,碰到个同名参数绑定的问题,参考了好几篇文章才解决问题,所以自己在这里总结一下,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:比如,我的表单是这样的:<form action...
    99+
    2023-05-31
    springmvc 同名参数绑定 sprin
  • 关于Python变量命名规则的常见误解及解决方案
    Python变量命名规则的常见误区及解决方法 在Python编程中,正确的变量命名是非常重要的。一个良好的命名习惯可以使代码更易读、易维护,并且可以避免一些潜在的错误。然而,新手常常会犯一些常见的变量命名误区。本文将介绍一些常见...
    99+
    2024-01-20
    变量命名规则 解决方法。 误区
  • 关于sql和mysql对于别名不能调用的理解有哪些
    本篇文章为大家展示了关于sql和mysql对于别名不能调用的理解有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在写sql的时候,由于有部分语句别名不能调用,百...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作