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方法将其注册到注册表中。

posted @ 2025-12-01 10:10  那就改变世界吧  阅读(1)  评论(0)    收藏  举报