Spring源码阅读之DefaultListableBeanFactory

注:本文所有的源码对应spring jar version为4.2.4

类图

开篇先给出DefaultListableBeanFactory类图,本篇将根据类图的继承关系从上往下依次分析。

相关类介绍

  • AliasRegistry:定义alias相关的简单的增删改查等操作;
  • SimpleAliasRegistry:实现接口AliasRegistry,使用map做alias的缓存;
  • SingletonBeanRegistry:定义单例的注册及获取;
  • BeanFactory:定义获取bean及bean的各种特性;
  • DefaultSingletonBeanRegistry:实现接口SingletonBeanRegistry;
  • HierarchicalBeanFactory:继承BeanFatory,并且在BeanFactory定义的功能的基础上增加了对parentFactory的支持;
  • BeanDefinitionRegistry:定义对BeanDefinition的增删改等操作;
  • FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能;
  • ConfigurableBeanFactory:提供配置Factory的各种方法;
  • ListableBeanFactory:根据各种条件获取bean的配置清单;
  • AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能;
  • AutowireCapableBeanFactory:提供bean的创建、自动注入、初始化和应用bean的后处理器;
  • AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并实现接口AutowireCapableBeanFactory;
  • ConfigurableListableBeanFactory:BeanFactory配置清单;
  • DefaultListableBeanFactory:综合上面所有的功能,对bean做处理后的注册。

具体源码分析

根据类图发现AliasRegistry、SingletonBeanRegistry、BeanFactory这三个类是最上层的父类,我们就先从这三个类开始分析。

AliasRegistry:

先上源码:
/**
 * 定义bean别名相关操作
 */
public interface AliasRegistry {

    /**
     * 给该name的bean定义一个别名
     * @param name bean的name
     * @param alias 别名
     * @throws IllegalStateException 别名已经存在或者不能被继承的bean抛出该异常
     */
    void registerAlias(String name, String alias);

    /**
     * 移除指定的别名
     * @param alias 需要移除的别名
     * @throws IllegalStateException 别名不存在是抛出该异常
     */
    void removeAlias(String alias);

    /**
     * 判断name是否是已经注册的别名
     * @param name
     * @return true/false
     */
    boolean isAlias(String name);

    /**
     * 返回该name注册的所有的别名
     * @param name
     * @return
     */
    String[] getAliases(String name);
}
具体的注释在代码中已经详细给出,具体的其他的讲解在此不做赘述。

SingletonBeanRegistry:

源码:
/**
 * 定义对单例的注册及获取
 */
public interface SingletonBeanRegistry {

    /**
     * 单例注册
     * @param beanName
     * @param singletonObject
     */
    void registerSingleton(String beanName, Object singletonObject);

    /**
     * 根据beanName获取单例
     * @param beanName
     * @return
     */
    Object getSingleton(String beanName);

    /**
     * 判断该bean是否已经有注册的单例
     * @param beanName
     * @return
     */
    boolean containsSingleton(String beanName);

    /**
     * 获取所有已注册单例的bean的name
     * @return
     */
    String[] getSingletonNames();

    /**
     * 计算已注册的单例数量
     * @return
     */
    int getSingletonCount();

    /**
     * return the singleton mutex used by this registry
     * @return
     */
    Object getSingletonMutex();
}

BeanFactory:

源码:
/**
 * 定义获取bean以及bean的相关属性
 */
public interface BeanFactory {

    /**
     * 标识符,用以区分是否是由FactoryBean创建
     */
    String FACTORY_BEAN_PREFIX = "&";

    /**
     * 根据name返回该类的一个实例
     * @param name bean的name
     * @return 类的实例
     * @throws BeansException 没有该类的时候抛出该异常
     */
    Object getBean(String name) throws BeansException;

    /**
     * 根据name返回一个指定类型的实例
     * @param name bean的name
     * @param requiredType 指定的类型
     * @param <T>
     * @return 类的指定类型实例
     * @throws NoSuchBeanDefinitionException 没有该类的定义的时候抛出该异常
     * @throws BeanNotOfRequiredTypeException 该类没有指定的类型时抛出该异常
     * @throws BeansException 类不能被创建的时候抛出该异常
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 返回符合指定类型的类的实例
     * @param requiredType 指定类型
     * @param <T>
     * @return 指定类型的类的实例
     * @throws NoSuchBeanDefinitionException 没有符合该类型的类的定义时抛出该异常
     * @throws NoUniqueBeanDefinitionException 符合该类型的类超过一个时抛出该异常
     * @throws BeansException 类不能被创建的时候抛出该异常
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;

    /**
     * 根据name返回该类的一个实例
     * @param name bean的name
     * @param args 创建实例需要的参数
     * @return 类的实例
     * @throws NoSuchBeanDefinitionException 没有该类的定义时抛出该异常
     * @throws BeanDefinitionStoreException
     * @throws BeansException 类不能被创建的时候抛出该异常
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * 返回符合指定类型的类的实例
     * @param requiredType 指定类型
     * @param args 创建实例需要的参数
     * @param <T>
     * @return 类的实例
     * @throws NoSuchBeanDefinitionException 没有符合该类型的类的定义时抛出该异常
     * @throws BeanDefinitionStoreException
     * @throws BeansException 类不能被创建的时候抛出该异常
     */
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    /**
     * 判断factory中是否包含指定name的bean的定义或者是否已经注册了单例
     * @param name
     * @return
     */
    boolean containsBean(String name);

    /**
     * 判断该name的bean是否是单例
     * @param name bean的name
     * @return
     * @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
     */
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    /**
     * 判断该name的bean是否是java prototype
     * @param name
     * @return
     * @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
     */
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    /**
     * 判断是否存在符合特殊类型的bean
     * @param name bean的name
     * @param typeToMatch 符合的特殊类型type
     * @return
     * @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
     */
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    /**
     * 判断是否存在符合指定类型的bean
     * @param name bean的name
     * @param typeToMatch 指定类型type
     * @return
     * @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
     */
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    /**
     * 返回该name的bean的类型
     * @param name bean的name
     * @return bean的类型
     * @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
     */
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    /**
     * 返回该name的bean的所有的别名
     * @param name bean的name
     * @return 该bean的别名
     */
    String[] getAliases(String name);
}

看完三个基本的父类之后,我们依次往下看相关的源码。考虑到后面的源码量比较大,我会在后文中给出具体的源码分析。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值