Spring源碼解析(一)-BeanFactory和FactoryBean

本系列博客針對Spring4.2.4版本,參考《Spring技術內幕》第2版

BeanFactory

BeanFactory是最基本的IOC容器接口,這個接口為具體的IOC容器的實現作了最基本的功能規定

BeanFactory類結構體系

BeanFactory結構體系.png

BeanFactory類詳解

public interface BeanFactory {

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

    //根據bean的名字,在IOC容器中得到bean實例
    Object getBean(String name) throws BeansException;

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

    //根據指定的類型取得IoC容器中管理的Bean
    <T> T getBean(Class<T> requiredType) throws BeansException;

    //重載了getBean(String name)方法,可變參數用來指定構造方法或者工廠方法需要的參數
    //覆蓋之前已經在bean中定義好的參數
    Object getBean(String name, Object... args) throws BeansException;

    //重載了getBean(Class<T> requiredType)方法,可變參數用來指定構造方法或者工廠方法需要的參數
    //覆蓋之前已經在bean中定義好的參數
    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    //判斷在IOC容器是否 有這個名字的bean
    boolean containsBean(String name);

    //查詢指定名字的Bean是否是單態類型(singleton)
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    //查詢指定名字的Bean是否是原型(prototype)類型
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    //查詢指定名字的Bean的class類型是否支持特定的class類型
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;

    //查詢指定名字的Bean的class類型
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    //查詢指定名字的Bean的所有別名
    String[] getAliases(String name);

}

生命周期

 * <p>Bean factory implementations should support the standard bean lifecycle interfaces
 * as far as possible. The full set of initialization methods and their standard order is:<br>
 * 1. BeanNameAware's {@code setBeanName}<br>
 * 2. BeanClassLoaderAware's {@code setBeanClassLoader}<br>
 * 3. BeanFactoryAware's {@code setBeanFactory}<br>
 * 4. ResourceLoaderAware's {@code setResourceLoader}
 * (only applicable when running in an application context)<br>
 * 5. ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
 * (only applicable when running in an application context)<br>
 * 6. MessageSourceAware's {@code setMessageSource}
 * (only applicable when running in an application context)<br>
 * 7. ApplicationContextAware's {@code setApplicationContext}
 * (only applicable when running in an application context)<br>
 * 8. ServletContextAware's {@code setServletContext}
 * (only applicable when running in a web application context)<br>
 * 9. {@code postProcessBeforeInitialization} methods of BeanPostProcessors<br>
 * 10. InitializingBean's {@code afterPropertiesSet}<br>
 * 11. a custom init-method definition<br>
 * 12. {@code postProcessAfterInitialization} methods of BeanPostProcessors
 *
 * <p>On shutdown of a bean factory, the following lifecycle methods apply:<br>
 * 1. DisposableBean's {@code destroy}<br>
 * 2. a custom destroy-method definition

BeanFactory和FactoryBean的區別和聯系

BeanFactory是spring容器的根容器,描述了子接口(子容器)的一些處理原則,包括一些生命周期,方法和約定。FactoryBean本身是存活在IOC容器(BeanFactory)中,本身也是一個工廠,用于創建由FactoryBean所能創建出來的對象,再創建出該對象時,可以對該對象的后面或者前面做一些額外的操作來實現AOP。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容