《深刻理解Spring系列之一:开篇》中提到在Spring容器启动的过程当中,会将类解析成Spring内部的BeanDefinition结构,并将BeanDefinition存储到一个叫DefaultListableBeanFactory中,本篇将深刻分析BeanFactory。bash
首先,看一下DefaultListableBeanFactory的类图,
post
能够看到DefaultListableBeanFactory间接实现了BeanFactory接口,先来分析一下这个BeanFactory,直接查看BeanFactory源代码,ui
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
T getBean(String name, Class requiredType) throws BeansException;
T getBean(Class requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
T getBean(Class requiredType, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class typeToMatch) throws NoSuchBeanDefinitionException;
Class getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}复制代码
从接口中的方法名能够很容易的理解每一个方法的意图,最经常使用或者最多见的就是getBean方法,用于获取Bean的实例。BeanFactory是用于访问Spring Bean容器的根接口,是一个单纯的Bean工厂,也就是常说的IOC容器的顶层定义,各类IOC容器是在其基础上为了知足不一样需求而扩展的,包括常用的ApplicationContext。spa
DefaultListableBeanFactory是整个Bean加载的核心部分,是Spring注册及加载Bean的默认实现。下面列出了DefaultListableBeanFactory源代码中两个重要的属性,code
/** Map of bean definition objects, keyed by bean name */
private final Map beanDefinitionMap = new ConcurrentHashMap(256);
/** List of bean definition names, in registration order */
private volatile List beanDefinitionNames = new ArrayList(256);复制代码
其中,bean的定义被解析成BeanDefinition,同时解析获得beanName,将beanName和BeanDefinition存储到beanDefinitionMap中,同时会将beanName存储到beanDefinitionNames中。cdn
DefaultListableBeanFactory间接继承DefaultSingletonBeanRegistry,DefaultSingletonBeanRegistry中有以下属性,对象
/** Cache of singleton objects: bean name --> bean instance */
private final Map singletonObjects = new ConcurrentHashMap(256);复制代码
singletonObjects用于存储单例bean的实例,getBean方法就是从这个Map里取实例对象。blog