今天看啥  ›  专栏  ›  涣涣虚心0215

Spring IOC(3)BeanFactory概览

涣涣虚心0215  · 简书  ·  · 2020-12-07 20:17

文章预览

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

DefaultListableBeanFactory

DefaultListableBeanFactory继承关系

通过这个类继承关系图,可以看到DefaultListableBeanFactory实现了 AliasRegistry SingletonBeanRegistry BeanFactory 这三大顶层接口。

  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;
}

………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览