@Service标注的bean,类名:EBSupplierService

jsf服务的配置:

<bean id=\"ebMonitorInnerServiceFacadeImpl\" class = \"com.trip.hotel.inner.api.impl.EBMonitorInnerServiceFacadeImpl\"/>
<jsf:provider id=\"ebMonitorInnerServiceFacade\"
              interface=\"com.trip.hotel.inner.api.impl.EBMonitorInnerServiceFacade\"
              alias=\"test\" ref=\"ebMonitorInnerServiceFacadeImpl\" server=\"jsf\" />

注入时报错:\"\"

 

查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致

public class AnnotationBeanNameGenerator implements BeanNameGenerator {

	private static final String COMPONENT_ANNOTATION_CLASSNAME = \"org.spring work.stereotype.Component\";


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

	

	/**
	 * Derive a default bean name from the given bean definition.
	 * <p>The default implementation delegates to {@  #buildDefaultBeanName(BeanDefinition)}.
	 * @param definition the bean definition to build a bean name for
	 * @param registry the registry that the given bean definition is being registered with
	 * @return the default bean name (never {@code null})
	 */
	protected String buildDefaultBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
		return buildDefaultBeanName(definition);
	}

	/**
	 * Derive a default bean name from the given bean definition.
	 * <p>The default implementation simply builds a decapitalized version
	 * of the short class name: e.g. \"mypackage.MyJdbcDao\" -> \"myJdbcDao\".
	 * <p>Note that inner classes will thus have names of the form
	 * \"outerClassName.InnerClassName\", which because of the period in the
	 * name may be an issue if you are autowiring by name.
	 * @param definition the bean definition to build a bean name for
	 * @return the default bean name (never {@code null})
	 */
	protected String buildDefaultBeanName(BeanDefinition definition) {
		String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
		return Introspector.decapitalize(shortClassName);
	}

}
Introspector类

 

/**
     * Utility method to take a string and convert it to normal Java variable
     * name capitalization.  This normally means converting the first
     * character from upper case to lower case, but in the (unusual) special
     * case when there is more than one character and both the first and
     * second characters are upper case, we leave it alone.
     * <p>
     * Thus \"FooBah\" becomes \"fooBah\" and \"X\" becomes \"x\", but \"URL\" stays
     * as \"URL\".
     *
     * @param  name The string to be decapitalized.
     * @return  The decapitalized version of the string.
     */
    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);
    }

当前两个字母都为大写时,则直接返回类名。

收藏 打印