Spring核心組件之Bean
Bean的類層次結構
Bean的頂層接口是BeanFactory,在源碼的位置是
/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
DefaultListableBeanFactory實現了所有的接口。但是爲什麼需要定義這麼多的接口?爲了區分在spring的內部對象的傳遞和轉化過程中,對對象的數據訪問所做的限制。ListableBeanFactory表示這些bean是可列表的,HierarchicalBeanFactory表示這些bean是有繼承關係的,AutowireCapableBeanFactory定義這些bean的自動裝配規則。
Bean的定義類層次
核心是RootBeanDefinition,在源碼的位置是
/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java
當spring成功的解析了一個
<bean></bean>
中定義的節點後,在spring的內部被轉化成BeanDefinition對象。以後所有的操作都是基於這個對象的
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);
}