01.spring中bean形成原理
步骤
1.首先需要知道类的全限定名:com.example.service.UserService
2.(核心)将全限定名转换为Class对象,使用的核心方法是ClassUtils.forName
public static class<?> forName(String className,classLoader classLoader){
String resolvedClassName = resolvedClassName(className):
ClassLoader classLoader = classLoader;
if(classLoader == null)classLoader = getDefaultClassLoader();//Spring默认类加载器
return classLoader.loadClass(resolvedClassName);//通过类加载器加载类
}
3.将 class 对象与BeanDefinition绑定(还有别的信息,如:scope、abstract……)
public class BeanDefinition {
private Class<?> beanClass;
private String beanClassName;
......
// 提供setBeanClass方法存入beanClass
}
4.Bean注册表是容器内部维护的一个核心数据结构,是Spring容器的 “内存数据库”,专门存放BeanDefinition对象,Spring 通过BeanDefinitionRegistry接口定义了注册表的核心功能
registerBeanDefinition(String beanName, BeanDefinition beanDefinition) // beanName为id或name
getBeanDefinition(String beanName) // 根据beanName从注册表中获取
containsBeanDefinition(String beanName) // 是否存在指定beanName的
getBeanDefinitionNames() // 获取注册表中所有Bean定义的beanName数组
removeBeanDefinition(String beanName)
核心表
public class DefaultListableBeanFactory extends … implements … BeanDefinitionRegistry {
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(16); // key是beanName value是BeanDefinition
private volatile List<String> beanDefinitionNames = new ArrayList<>(16);
//存储别名与 beanName 的映射:key 是别名,value 是对应的 beanName
private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);
}
5.容器启动时,XML 解析器会解析<bean>标签,提取class、id、property等信息,创建BeanDefinition对象,最终通过BeanDefinitionRegistry的registerBeanDefinition方法将其注册到注册表中。

浙公网安备 33010602011771号