• spring组件之BeanFactory


    在学习spring容器中,最先接触的可能是 ApplicationContext,但beanFactory才是spring提供的最顶级的容器。

    1. 什么是beanFactory

    beanFactory 从名称上来看,它的意思是bean 工厂,它是生产 bean保存 bean (针对单例 bean)的地方。

    我们先来看看beanFactory提供了哪些方法:

    public interface BeanFactory {
    
        /**
         * factoryBean使用
         */
        String FACTORY_BEAN_PREFIX = "&";
    
        /**
         * 根据名称获取bean
         */
        Object getBean(String name) throws BeansException;
    
        /**
         * 根据名称获取bean
         */
         T getBean(String name, Class requiredType) throws BeansException;
    
        /**
         * 根据名称获取bean
         */
        Object getBean(String name, Object... args) throws BeansException;
    
        /**
         * 根据类型获取bean
         */
         T getBean(Class requiredType) throws BeansException;
    
        /**
         * 根据类型获取bean
         */
         T getBean(Class requiredType, Object... args) throws BeansException;
    
        /**
         * 获取BeanProvider
         */
         ObjectProvider getBeanProvider(Class requiredType);
    
        /**
         * 获取BeanProvider
         */
         ObjectProvider getBeanProvider(ResolvableType requiredType);
    
        /**
         * 是否包含bean
         */
        boolean containsBean(String name);
    
        /**
         * 是否为单例bean
         */
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    
        /**
         * 是否为原型bean
         */
        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    
        /**
         * 判断类型是否匹配
         */
        boolean isTypeMatch(String name, ResolvableType typeToMatch) 
                throws NoSuchBeanDefinitionException;
    
        /**
         * 判断类型是否匹配
         */
        boolean isTypeMatch(String name, Class typeToMatch) 
                throws NoSuchBeanDefinitionException;
    
        /**
         * 根据名称获取bean的类型
         */
        @Nullable
        Class getType(String name) throws NoSuchBeanDefinitionException;
    
        /**
         * 根据名称获取bean的类型
         */
        @Nullable
        Class getType(String name, boolean allowFactoryBeanInit) 
                throws NoSuchBeanDefinitionException;
    
        /**
         * 根据bean名称获取bean的别名
         */
        String[] getAliases(String name);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    BeanFactory 接口定义了beanFactory的基本操作,可以看到,其提供了非常多的getBean(...)方法。

    我们再看看看beanFactory 的继承关系:

    可以看到,beanFactory 经过了重重继承,功能也由其子接口一步步扩展,接口提供功能,类来进行实现,最终得到的是DefaultListableBeanFactory,这也是 spring 默认使用的beanFactory

    我们来看看这些接口的功能:

    • BeanFactory:最基本的BeanFactory,定义了基本的操作
    • HierarchicalBeanFactory:提供了继承功能,用来获取ParentBeanFactory(设置ParentBeanFactory的操作在ConfigurableBeanFactory中)
    • ListableBeanFactory:提供list操作,如列出符合条件的BeanNameBean
    • ConfigurableBeanFactory:提供配置操作,如设置ParentBeanFactory、设置BeanClassLoader、设置BeanClassLoader
    • AutowireCapableBeanFactory:提供bean的手动注入功能,如createBean(Class)可以将Class初始化spring bean,autowireBean(Object)可以将一个java实例初始化成spring bean
    • ConfigurableListableBeanFactory:组合了ListableBeanFactoryConfigurableBeanFactory接口的功能

    最后是DefaultListableBeanFactory,这个类实现了以上的所有接口,包含了上面的所有功能,接下来我分析我们基本都是基于这个类。

    2. DefaultListableBeanFactory

    spring 的 applicationContext 中默认的 beanFactory 就是 DefaultListableBeanFactory,因此这个类非常非常重要,这里我们简单列举下平时经常用到的属性:

    • beanDefinitionMap:存放beanDefinitionMap
    • beanDefinitionNames:存放beanDefinition名称的List
    • singletonObjects:继承自DefaultSingletonBeanRegistry类,存放单例beanmap

    beanFactory 中,最重要的内容要算beanDefinitionsingletonBean了,DefaultListableBeanFactory中有各自对应的结构来存储这些。接下来我们再看看一些重要的方法:

    方法 说明
    DefaultSingletonBeanRegistry#addSingleton(String, Object) 手动添加一个单例 beanbeanFactory
    AbstractAutowireCapableBeanFactory#createBean(Class, int, boolean) 手动创建一个spring bean(有完整的spring bean生命周期,即实例化、属性注入、初始化等)
    AbstractAutowireCapableBeanFactory#autowire(Class, int, boolean) 创建对应的Class实例后,再对其属性注入(只有两个操作:实例化、属性注入)
    AbstractAutowireCapableBeanFactory#autowireBean(Object) 对传入的bean进行属性注入(只有属性注入操作)
    BeanFactory#getBean(String, ...) 根据bean的名称获取对应的bean,如果该bean不存在但对应的beanDefinition存在,则创建bean,如果对应的beanDefinition
  • 相关阅读:
    买火车票的学问
    初学后端,如何做好表结构设计?
    仙人掌之歌——投石问路(3)
    Linux:ll命令详解
    rdkit Recap、BRICS将smiles切分为片段(fragment)
    PBI 访问情况
    MySQL运维8-Mycat分库分表之范围分片
    通过开发者工具-网络排查响应时间过长的问题
    mysql文档--myisam存储引擎--myisam引擎全解--底层探索
    Python超入门(5)__迅速上手操作掌握Python
  • 原文地址:https://blog.csdn.net/Huangjiazhen711/article/details/127610535