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> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 根据名称获取bean
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * 根据类型获取bean
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;

    /**
     * 根据类型获取bean
     */
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    /**
     * 获取BeanProvider
     */
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

    /**
     * 获取BeanProvider
     */
    <T> ObjectProvider<T> 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);

}

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值