Spring源码深度解析(郝佳)-学习-Bean Id 获取

20 篇文章 1 订阅
18 篇文章 0 订阅

首先上图,我们要获取类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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值