• Spring源码--容器的基本实现与BeanDefinition


    image.png
    DefaultListableBeanFactory是Spring注册及加载bean的默认实现,bean工厂
    AliasRegistry:定义对alia的简单增删改查等操作
    SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现
    SingletonBeanRegistry:定义对单例的注册及获取
    DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry的实现
    BeanFactory:定义获取bean及bean的各种属性
    HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory定义的功能基础上增加了对parentFactroy的支持
    FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能
    ConfigurableBeanFactory:提供配置Factory的各种方法
    LisableBeanFactory:提供各种条件获取Bean的配置清单
    AbstractBeanFactory:结合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能
    AutowireCapableBeanFactory:提供创建bean、自动注入、初始化以及应用bean的后处理器
    AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对AutowireCapableBeanFactory进行实现
    ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型或接口等
    DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理

    XmlBeanDefinitionReader

    image.png1.通过继承AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件。
    2.通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件。
    3.通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析, 并使用BeanDefinitionParserDelegate对Element进行解析。

    配置文件封装

    Spring有一个Resource抽象,会将XML配置文件封装为Resource类型。

    public AbstractAutowireCapableBeanFactory() {
    		super();
            // 忽略BeanNameAware类型的依赖注入
            // 作用是忽略XML由Set方法的依赖注入,由开发者自行进行注入,如通过Aware进行注入
           // BeanFactory通过BeanFactoryAware注入
    		ignoreDependencyInterface(BeanNameAware.class);
    		ignoreDependencyInterface(BeanFactoryAware.class);
    		ignoreDependencyInterface(BeanClassLoaderAware.class);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    BeanDefinition

    image.png
    BeanDefinition是一个接口,在Spring中有三种实现ChildBeanDefinition,RootBeanDefinitino,GenericBeanDefinition。其中ChildBeanDefinition意为子,RootBeanDefinition意为父,不能设置parentName,子能够从父继承配置。而GenericBeanDefinition是通用的,更加灵活,避免硬编码为Root或者Child。

    注册BeanDefinition
    1. 通过beanName注册·BeanDefinition
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
    			throws BeanDefinitionStoreException {
        // 这里是BeanDefinitionRegistry接口定义的方法
    }
    
    • 1
    • 2
    • 3
    • 4

    2.注册别名
    别名的作用:组件A定义了名为componentA的bean,组件B想用componentB引用它,而MyApp想用myApp引用它。这时候就给组件A起两个别名。

    public void registerAlias(String name, String alias) {
        // 这里是AliasRegistry接口定义的方法
    }
    
    • 1
    • 2
    • 3
  • 相关阅读:
    算法-3.无重复字符的最长子串
    【翻译】Seastar 教程(二)
    11. IOC容器的加载过程
    上周热点回顾(2.27-3.5)
    倍福PLC基于CX5130实现数据的断电保持
    Java岗史上最全八股文面试真题汇总,堪称2022年面试天花板
    基于Boost的搜索引擎
    JMESPath: 强大的处理JSON数据
    计算机毕业设计Java租车系统(源码+系统+mysql数据库+lw文档)
    消息队列面试题(2022最新整理)
  • 原文地址:https://blog.csdn.net/Xjzzon/article/details/126573051