深入理解Spring系列之三:BeanFactory解析


  《深入理解Spring系列之一:開篇》中提到在Spring容器啟動的過程中,會將類解析成Spring內部的BeanDefinition結構,並將BeanDefinition存儲到一個叫DefaultListableBeanFactory中,本篇將深入分析BeanFactory。

  首先,看一下DefaultListableBeanFactory的類圖,

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里取實例對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM