《深入理解Spring系列之一:開篇》中提到在Spring容器啟動的過程中,會將類解析成Spring內部的BeanDefinition結構,並將BeanDefinition存儲到一個叫DefaultListableBeanFactory中,本篇將深入分析BeanFactory。
首先,看一下DefaultListableBeanFactory的類圖,
可以看到DefaultListableBeanFactory間接實現了BeanFactory接口,先來分析一下這個BeanFactory,直接查看BeanFactory源代碼,
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> 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。
DefaultListableBeanFactory是整個Bean加載的核心部分,是Spring注冊及加載Bean的默認實現。下面列出了DefaultListableBeanFactory源代碼中兩個重要的屬性,
/** Map of bean definition objects, keyed by bean name */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256); /** List of bean definition names, in registration order */ private volatile List<String> beanDefinitionNames = new ArrayList<String>(256);
其中,bean的定義被解析成BeanDefinition,同時解析得到beanName,將beanName和BeanDefinition存儲到beanDefinitionMap中,同時會將beanName存儲到beanDefinitionNames中。
DefaultListableBeanFactory間接繼承DefaultSingletonBeanRegistry,DefaultSingletonBeanRegistry中有如下屬性,
/** Cache of singleton objects: bean name --> bean instance */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
singletonObjects用於存儲單例bean的實例,getBean方法就是從這個Map裡取實例對象。