parent
68d87e0bdf
commit
0a12245817
@ -0,0 +1,145 @@
|
||||
# Spring BeanDefinitionReaderUtils
|
||||
- Author: [HuiFer](https://github.com/huifer)
|
||||
- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read)
|
||||
|
||||
|
||||
|
||||
## createBeanDefinition
|
||||
- `org.springframework.beans.factory.support.BeanDefinitionReaderUtils.createBeanDefinition`
|
||||
|
||||
|
||||
|
||||
```java
|
||||
public static AbstractBeanDefinition createBeanDefinition(
|
||||
@Nullable String parentName, @Nullable String className, @Nullable ClassLoader classLoader) throws ClassNotFoundException {
|
||||
|
||||
GenericBeanDefinition bd = new GenericBeanDefinition();
|
||||
// 设置 父bean
|
||||
bd.setParentName(parentName);
|
||||
if (className != null) {
|
||||
if (classLoader != null) {
|
||||
// 设置 class
|
||||
// 内部是通过反射创建 class
|
||||
bd.setBeanClass(ClassUtils.forName(className, classLoader));
|
||||
}
|
||||
else {
|
||||
// 设置 class name
|
||||
bd.setBeanClassName(className);
|
||||
}
|
||||
}
|
||||
return bd;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## generateBeanName
|
||||
|
||||
- `org.springframework.beans.factory.support.BeanDefinitionReaderUtils.generateBeanName(org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.support.BeanDefinitionRegistry, boolean)`
|
||||
|
||||
```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;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## uniqueBeanName
|
||||
|
||||
```java
|
||||
public static String uniqueBeanName(String beanName, BeanDefinitionRegistry registry) {
|
||||
String id = beanName;
|
||||
int counter = -1;
|
||||
|
||||
// Increase counter until the id is unique.
|
||||
while (counter == -1 || registry.containsBeanDefinition(id)) {
|
||||
counter++;
|
||||
// beanName + # + 序号
|
||||
id = beanName + GENERATED_BEAN_NAME_SEPARATOR + counter;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## registerBeanDefinition
|
||||
|
||||
```java
|
||||
public static void registerBeanDefinition(
|
||||
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
|
||||
throws BeanDefinitionStoreException {
|
||||
|
||||
// Register bean definition under primary name.
|
||||
// 获取 beanName
|
||||
String beanName = definitionHolder.getBeanName();
|
||||
// 注册bean definition
|
||||
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
|
||||
|
||||
// Register aliases for bean name, if any.
|
||||
// 别名列表
|
||||
String[] aliases = definitionHolder.getAliases();
|
||||
// 注册别名列表
|
||||
if (aliases != null) {
|
||||
for (String alias : aliases) {
|
||||
registry.registerAlias(beanName, alias);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## registerWithGeneratedName
|
||||
|
||||
```java
|
||||
public static String registerWithGeneratedName(
|
||||
AbstractBeanDefinition definition, BeanDefinitionRegistry registry)
|
||||
throws BeanDefinitionStoreException {
|
||||
|
||||
// 生成一个 beanName
|
||||
String generatedName = generateBeanName(definition, registry, false);
|
||||
// 注册 bean Definition
|
||||
registry.registerBeanDefinition(generatedName, definition);
|
||||
return generatedName;
|
||||
}
|
||||
```
|
Loading…
Reference in new issue