You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
source-code-hunter/docs/Spring/clazz/Spring-BeanNameGenerator.md

140 lines
3.7 KiB

# Spring BeanNameGenerator
- Author: [HuiFer](https://github.com/huifer)
- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read)
- `org.springframework.beans.factory.support.BeanNameGenerator`
- 方法用来生成 beanName
```java
public interface BeanNameGenerator {
/**
* Generate a bean name for the given bean definition.
* 生成 beanName
* @param definition the bean definition to generate a name for
* @param registry the bean definition registry that the given definition
* is supposed to be registered with
* @return the generated bean name
*/
String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry);
}
```
![](/images/spring/BeanNameGenerator.png)
## DefaultBeanNameGenerator
- `org.springframework.beans.factory.support.DefaultBeanNameGenerator`
- 调用工具类方法进行生成
```JAVA
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
return BeanDefinitionReaderUtils.generateBeanName(definition, registry);
}
```
1. ClassName + # + 十六进制字符
2. parentName + $child + # + 十六进制字符
3. factoryBeanName +$created+# + 十六进制字符
4. beanName + # + 序号
```java
public static String generateBeanName(
BeanDefinition definition, BeanDefinitionRegistry registry, boolean isInnerBean)
throws BeanDefinitionStoreException {
// 获取 bean class 的名称
// Class.getName()
String generatedBeanName = definition.getBeanClassName();
if (generatedBeanName == null) {
// 父类名称是否存在
if (definition.getParentName() != null) {
generatedBeanName = definition.getParentName() + "$child";
}
// 工厂 beanName 是否为空
else if (definition.getFactoryBeanName() != null) {
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) {
// Inner bean: generate identity hashcode suffix.
// 组装名称
// 生成名称 + # + 16 进制的一个字符串
id = generatedBeanName + GENERATED_BEAN_NAME_SEPARATOR + ObjectUtils.getIdentityHexString(definition);
}
else {
// Top-level bean: use plain class name with unique suffix if necessary.
// 唯一beanName设置
// // beanName + # + 序号
return uniqueBeanName(generatedBeanName, registry);
}
return id;
}
```
## AnnotationBeanNameGenerator
1. 获取注解的value作为beanName
2. 类名首字母小写
```java
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
if (definition instanceof AnnotatedBeanDefinition) {
// 从注解中获取 beanName
// 获取注解的value属性值
String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
if (StringUtils.hasText(beanName)) {
// Explicit bean name found.
// 如果存在直接返回
return beanName;
}
}
// Fallback: generate a unique default bean name.
// 默认beanName
// 类名,首字母小写
return buildDefaultBeanName(definition, registry);
}
```
## FullyQualifiedAnnotationBeanNameGenerator
- 全类名
```java
@Override
protected String buildDefaultBeanName(BeanDefinition definition) {
String beanClassName = definition.getBeanClassName();
Assert.state(beanClassName != null, "No bean class name set");
return beanClassName;
}
```