程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 深入理解Spring系列之三:BeanFactory解析,springbeanfactory

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

編輯:JAVA綜合教程

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


  《深入理解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裡取實例對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved