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,否则就把第一个字母小写。

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

  • 相关阅读:
    可扩展设计的三个维度
    今天用批处理脚本遇到的两个问题
    响应式编程学习记录
    ThreadLocal使用注意
    JDK8 函数式接口
    Java多线程相关的常用接口
    java异步编程
    java多线程同步器
    paramiko获取远程主机的环境变量
    python为不同的对象如何分配内存的小知识
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/9090099.html
Copyright © 2011-2022 走看看