天天看點

BeanFactoryPostProcessor--- Spring源碼從入門到精通(二十七)

上篇文章主要介紹了事務的源碼:

事務有一個攔截器,先擷取事務相關屬性(相關屬性可以在事務注解上面配置),之後再擷取平台事務管理器PlatFormTransactionManager,最後執行目标方法,若正常,則擷取到事務管理器,送出事務,若有異常,則擷取到事務管理器,復原此次方法。

聲明式事務源碼解析--- Spring源碼從入門到精通(二十六)

這篇文章主要介紹beanFactoryPostProcessor源碼:

一、代碼實作

建立extConfig類,和myBeanFactoryPostProcessor類

/**
 * @author keying
 * @date 2021/7/15
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("myBeanFactoryPostProcessor。。。。。");
        int count = beanFactory.getBeanDefinitionCount();
        System.out.println("目前beanFactory幾個 bean:" + count);
        String[] strings = beanFactory.getBeanDefinitionNames();
        System.out.println("目前bean名稱:" + Arrays.asList(strings));
    }
}
 
 
 
/**
 *
 * beanPostProcessor:是bean的後置處理器,bean建立執行個體之後,初始化前後攔截的工作。
 * beanFactoryPostProcessor:是beanFactory的後置處理器。
 *  在beanFactory标準初始化之後調用:所有bean的定義已經儲存加載到beanFactory,但還未建立bean執行個體。
 *
 * @author keying
 */
@Configuration
@ComponentScan("com.alibaba.ext")
public class ExtConfig {
 
    @Bean("carBean")
    public Car car(){
        return new Car();
    }
}           

複制

/**
 * @author keying
 *
 */
public class AOPTestExt {
 
    @Test
    public void test() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
 
        applicationContext.close();
    }
 
}           

複制

junitTest運作之後列印如下,

是以beanFactoryPostProcessor是在car對象建立之前調用的。

BeanFactoryPostProcessor--- Spring源碼從入門到精通(二十七)

二、源碼分析

BeanPostProcessor:bean後置處理器,是在bean建立對象之後初始化前後進行攔截工作。

BeanFactoryProcessor:beanFactory後置處理器,在所有的bean定義已經儲存在beanFactory裡,但還未建立bean對象之前調用。

1、ioc容器建立對象

BeanFactoryPostProcessor--- Spring源碼從入門到精通(二十七)

2、Refresh()重新整理容器裡的invokeBeanFactoryPostProcessor()方法

如何找到beanFactoryPostProcessor并執行他們的方法?

1)、直接在beanFactory中找到所有類型是beanFactoryPostProcessor元件,并執行他們的方法。

先定義幾個list,按PriorityOrdered和Ordered類分類,最後可以看到執行nonOrderedPostProcessorNames的list集合。

BeanFactoryPostProcessor--- Spring源碼從入門到精通(二十七)
BeanFactoryPostProcessor--- Spring源碼從入門到精通(二十七)

2)、可以看到,之前初始化bean的方法在下面,是以beanFactory在其他對象初始化前執行。