首先上图,我们要获取类PropertySourcesPlaceholderConfigurer的id属性值
AbstractBeanDefinitionParser.java
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException { if (shouldGenerateId()) { return parserContext.getReaderContext().generateBeanName(definition); } else { String id = element.getAttribute(ID_ATTRIBUTE); if (!StringUtils.hasText(id) && shouldGenerateIdAsFallback()) { id = parserContext.getReaderContext().generateBeanName(definition); } return id; } }
XmlReaderContext.java
public String generateBeanName(BeanDefinition beanDefinition) { return this.reader.getBeanNameGenerator().generateBeanName(beanDefinition, getRegistry()); }
AbstractBeanDefinitionReader.java
public abstract class AbstractBeanDefinitionReader implements EnvironmentCapable, BeanDefinitionReader { private BeanNameGenerator beanNameGenerator = new DefaultBeanNameGenerator(); @Override public BeanNameGenerator getBeanNameGenerator() { return this.beanNameGenerator; } }
返回默认的DefaultBeanNameGenerator 的BeanName的创建器。
DefaultBeanNameGenerator.java
public class DefaultBeanNameGenerator implements BeanNameGenerator { @Override public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) { return BeanDefinitionReaderUtils.generateBeanName(definition, registry); } }
终于找到了核心代码了
BeanDefinitionReaderUtils.java
public static String generateBeanName(BeanDefinition beanDefinition, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { return generateBeanName(beanDefinition, registry, false); }
BeanDefinitionReaderUtils.java
public static String generateBeanName( BeanDefinition definition, BeanDefinitionRegistry registry, boolean isInnerBean) throws BeanDefinitionStoreException { String generatedBeanName = definition.getBeanClassName(); if (generatedBeanName == null) { //如果beanClassName为空,但是父类不为空,则beanName 为父类名$child if (definition.getParentName() != null) { generatedBeanName = definition.getParentName() + "$child"; } else if (definition.getFactoryBeanName() != null) { //如果beanClassName为空,父类名为空,但是工厂方法名不为空,则返回bean的工厂方法名$created generatedBeanName = definition.getFactoryBeanName() + "$created"; } } //如果既没有工厂方法,又没有父类,还本身也没有类名,则直接抛出异常 if (!StringUtils.hasText(generatedBeanName)) { throw new BeanDefinitionStoreException("Unnamed bean definition specifies neither " + "'class' nor 'parent' nor 'factory-bean' - can't generate bean name"); } String id = generatedBeanName; if (isInnerBean) { //如果是内部类,则使用上面得到的generatedBeanName+"#"+beanDefinition的十六进制数据,我觉得相当于一个随机数据 id = generatedBeanName + "#" + ObjectUtils.getIdentityHexString(definition); } else { // 如果不是内部类,counter则先从0开始,然后到BeanDefinitionMap中去找, // 如果存在了,则 +1 ,直到BeanDefinitionMap中没有为止,最后返回一个generatedBeanName+"#" + counter, // 如本例中返回的就是 // org.springframework.context.support.PropertySourcesPlaceholderConfigurer#0 int counter = -1; while (counter == -1 || registry.containsBeanDefinition(id)) { counter++; id = generatedBeanName + "#" + counter; } } return id; }