Spring核心組件之Bean

Spring核心組件之Bean


Bean的類層次結構

Bean的頂層接口是BeanFactory,在源碼的位置是

/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java

Bean的類層次結構
DefaultListableBeanFactory實現了所有的接口。但是爲什麼需要定義這麼多的接口?爲了區分在spring的內部對象的傳遞和轉化過程中,對對象的數據訪問所做的限制。ListableBeanFactory表示這些bean是可列表的,HierarchicalBeanFactory表示這些bean是有繼承關係的,AutowireCapableBeanFactory定義這些bean的自動裝配規則。

Bean的定義類層次

核心是RootBeanDefinition,在源碼的位置是

/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java

Bean的定義類層次

當spring成功的解析了一個

<bean></bean>

中定義的節點後,在spring的內部被轉化成BeanDefinition對象。以後所有的操作都是基於這個對象的

Bean的解析過程

Bean的解析過程

Bean的解析主要是對spring的配置文件的解析。

Bean的地位

Bean在spring中的作用就像OOP對於java的作用,沒有bean就沒有spring存在的意義。

spring解決了一個重要的問題,把對象之間的依賴關係轉用配置文件來管理,也就是依賴注入機制。依賴注入在spring的IOC容器中進行管理,而IOC容器的主要操作對象就是bean。

源代碼

下面是BeanFactory的源碼,在BeanFactory裏只對IOC容器的基本行爲作了定義,至於如何產生具體的bean,由BeanFactory的實現類具體來實現。

public interface BeanFactory {

    /**
     * 這裏是對FactoryBean的轉義定義,因爲如果使用bean的名字檢索FactoryBean得到的對象是工廠生成的對象,  如果需要得到工廠本身,需要轉義
     */
    String FACTORY_BEAN_PREFIX = "&";

    //這裏根據bean的名字,在IOC容器中得到bean實例,這個IOC容器就是一個大的抽象工廠。
    Object getBean(String name) throws BeansException;

    //這裏根據bean的名字和Class類型來得到bean實例,如果根據名字取得的bean實例的Class類型和需要的不同的話,它會拋出異常
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    Object getBean(String name, Object... args) throws BeansException;

    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    //這裏提供對bean的檢索,看看是否在IOC容器有這個名字的bean
    boolean containsBean(String name);

     //這裏根據bean名字得到bean實例,並同時判斷這個bean是不是單例
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    //判斷給定名字的bean是不是Prototype
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    //判斷給定名字的bean是否與給定的類型相匹配
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    //這裏對得到bean實例的Class類型  
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    //這裏得到bean的別名,如果根據別名檢索,那麼其原名也會被檢索出來 
    String[] getAliases(String name);

}
發佈了266 篇原創文章 · 獲贊 9 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章