文章预览
Share一下Spring IOC的流程图:【
Spring IOC(1)流程图
】
上一篇看了
BeanDefinition
相关内容,接着就看看BeanFactory。
DefaultListableBeanFactory
DefaultListableBeanFactory继承关系
通过这个类继承关系图,可以看到DefaultListableBeanFactory实现了
AliasRegistry
,
SingletonBeanRegistry
,
BeanFactory
这三大顶层接口。
-
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);
}
-
HierarchicalBeanFactory
该接口实现BeanFactory接口,并实现了父子BeanFactory的功能。
public interface HierarchicalBeanFactory extends BeanFactory {
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String name);
}
-
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;
}
………………………………