zoukankan      html  css  js  c++  java
  • 记一次spring里bean无法注入的历程

    应用启动的时候失败,看了下异常,是这个---NoUniqueBeanDefinitionException。 大家都知道,这是因为有俩个类型相同的实例,在被注入的时候,spring不知道该用哪个。

    但是,我们都知道,一个向spring注册的bean,他的名字默认是这个类的shortclassname,然后对第一个字母小写。在使用的时候,使用@Resource注解,会先用这个字段的命名作为bean的name去spring里找。看了下,代码里完全遵守了这个规则,但是还是报错,所以到spring内部一看究竟。

    首先通过代码和异常信息结合起来看,发现我注册的俩个bean的name完全是他们的类的shortclassname,没有把第一个字母小写。这是为什么嘞?然后看下注册bean的过程,看下这个name生成的规则是什么。然后发现了下面这段代码:

    protected String buildDefaultBeanName(BeanDefinition definition) {
    String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
    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);
    }

    这里有一个逻辑是说,如果第一个字母和第二个字母都是大写的话,就直接使用类的shortname作为这个bean的name,否则就把第一个字母小写。

    嗯,我的这个俩个类名确实是第二个字母是大写。。。。

  • 相关阅读:
    网络基础知识
    mysql安装
    docker打包镜像
    python的基础
    python静态属性的理解
    python中的静态方法和类方法
    python类的两种创建方式
    python的继承
    python中time和datetime模块
    python之模块
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/9090099.html
Copyright © 2011-2022 走看看