Spring相关时序图系列

Spring IOC(3)BeanFactory概览

2020-12-07  本文已影响0人  涣涣虚心0215

Share一下Spring IOC的流程图:【Spring IOC(1)流程图
上一篇看了BeanDefinition相关内容,接着就看看BeanFactory。

DefaultListableBeanFactory

DefaultListableBeanFactory继承关系
通过这个类继承关系图,可以看到DefaultListableBeanFactory实现了AliasRegistrySingletonBeanRegistryBeanFactory这三大顶层接口。
  1. BeanFactory
    提供了一些列getBean()的方法声明,以及提供ObjectProvider(即ObjectFactory子类)的获取方法。
public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";
    //根据beanName获取bean实例,可以是单例也可以是原型。
    Object getBean(String name) throws BeansException;
    //根据beanName获取bean实例,必须match给定的class类型
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    //根据beanName获取bean实例,允许指定显式的构造函数/工厂方法参数
    Object getBean(String name, Object... args) throws BeansException;
    //ListableBeanFactory使用,返回唯一匹配给定对象类型的bean实例
    <T> T getBean(Class<T> requiredType) throws BeansException;
    //返回唯一匹配给定对象类型的bean实例,允许指定显式的构造函数/工厂方法参数
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
    //返回指定bean的BeanProvidor,允许延迟按需检索实例
    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
    //返回指定bean的BeanProvidor,允许延迟按需检索实例
    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
    //这个BeanFactory是不是存在该beanName对应的singleton bean
    boolean containsBean(String name);
    //判断beanName对应的bean是不是singleton
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    //判断beanName对应的bean是不是prototype
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    //判断这个beanName对应的bean是不是跟ResolvableType匹配
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    //判断这个beanName对应的bean是不是跟class匹配
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    //获取bean的class
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    //获取bean的aliases
    String[] getAliases(String name);
}
  1. HierarchicalBeanFactory
    该接口实现BeanFactory接口,并实现了父子BeanFactory的功能。
public interface HierarchicalBeanFactory extends BeanFactory {
   BeanFactory getParentBeanFactory();
   boolean containsLocalBean(String name);
}
  1. ListableBeanFactory
    该接口提供了能列举其包含的所有Bean功能,根据名字或其它单个查找Bean的特性。
    但是需要注意这些方法使用时候的限制,比如不支持向上或向下查找,以及不支持查找非配置文件定义的单例Bean(比如通过ConfigurableBeanFactory的registerSingleton方法配置的单例)
public interface ListableBeanFactory extends BeanFactory {
    //对于给定的beanName对应的BeanDefinition是否已存在
    boolean containsBeanDefinition(String beanName);
    //获取该工厂的BeanDefinition数量
    int getBeanDefinitionCount();
    //返回工厂中所有BeanDefinition的名字
    String[] getBeanDefinitionNames();
    //根据bean的类型获取bean
    String[] getBeanNamesForType(ResolvableType type);
    //根据bean的类型获取bean
    String[] getBeanNamesForType(@Nullable Class<?> type);
    //根据bean的类型获取bean
    String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
    //获取给定类型的bean names(包括子类)
    <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;
    //获取给定类型的bean names(包括子类)
    <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
            throws BeansException;
    //根据annotationType找到所有的应用了该Annotation的beanName
    String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
    //根据annotationType找到所有的应用了该Annotation的bean(beanName是key)
    Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
    //在beanName对应的bean上根据annotationType找Annotation
    <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
            throws NoSuchBeanDefinitionException;
}

上一篇 下一篇

猜你喜欢

热点阅读