通過點進ComponentScan注解進入源碼可以看到
追隨BeanNameGenerator進入源碼可以看到該類是個借口且只有一個方法
點擊上面黑色箭頭出現兩個實現方法
點擊第一個方法
進入determineBeanNameFromAnnotation方法中
通過上訴自定義一個生成beanName方法
- 先創建一個CustomeBeanNameGenerator類
- 實現BeanNameGenerator接口
- 重寫generateBeanName方法
public class CustomeBeanNameGenerator implements BeanNameGenerator {@Overridepublic String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {//定義Bean的名稱String beanName = null;//1.判斷當前bean的定義信息是否是注解的if(definition instanceof AnnotatedBeanDefinition){//2.把definition轉成注解的bean定義信息AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition)definition;//2.獲取注解Bean定義的元信息AnnotationMetadata annotationMetadata = annotatedBeanDefinition.getMetadata();//3.獲取定義信息中的所有注解Set<String> types = annotationMetadata.getAnnotationTypes();//4.遍歷types集合for(String type : types){//5.得到注解的屬性AnnotationAttributes attributes = AnnotationAttributes.fromMap(annotationMetadata.getAnnotationAttributes(type, false));//6.判斷attributes是否為null,同時必須是@Component及其衍生注解if (attributes != null && isStereotypeWithNameValue(type, annotationMetadata.getMetaAnnotationTypes(type), attributes)) {//7.獲取value屬性的值Object value = attributes.get("value");//8.判斷value屬性是否為String類型if (value instanceof String) {String strVal = (String) value;//9.判斷value屬性是否有值if (StringUtils.hasLength(strVal)) {if (beanName != null && !strVal.equals(beanName)) {throw new IllegalStateException("Stereotype annotations suggest inconsistent " +"component names: '" + beanName + "' versus '" + strVal + "'");}beanName = strVal;}}}}}return beanName != null ? "my"+beanName : "my"+buildDefaultBeanName(definition);}private static final String COMPONENT_ANNOTATION_CLASSNAME = "org.springframework.stereotype.Component";private boolean isStereotypeWithNameValue(String annotationType,Set<String> metaAnnotationTypes, @Nullable Map<String, Object> attributes) {boolean isStereotype = annotationType.equals(COMPONENT_ANNOTATION_CLASSNAME) ||metaAnnotationTypes.contains(COMPONENT_ANNOTATION_CLASSNAME) ||annotationType.equals("javax.annotation.ManagedBean") ||annotationType.equals("javax.inject.Named");return (isStereotype && attributes != null && attributes.containsKey("value"));}private 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);}
}