上篇文章主要介紹了事務的源碼:
事務有一個攔截器,先擷取事務相關屬性(相關屬性可以在事務注解上面配置),之後再擷取平台事務管理器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對象建立之前調用的。
二、源碼分析
BeanPostProcessor:bean後置處理器,是在bean建立對象之後初始化前後進行攔截工作。
BeanFactoryProcessor:beanFactory後置處理器,在所有的bean定義已經儲存在beanFactory裡,但還未建立bean對象之前調用。
1、ioc容器建立對象
2、Refresh()重新整理容器裡的invokeBeanFactoryPostProcessor()方法
如何找到beanFactoryPostProcessor并執行他們的方法?
1)、直接在beanFactory中找到所有類型是beanFactoryPostProcessor元件,并執行他們的方法。
先定義幾個list,按PriorityOrdered和Ordered類分類,最後可以看到執行nonOrderedPostProcessorNames的list集合。
2)、可以看到,之前初始化bean的方法在下面,是以beanFactory在其他對象初始化前執行。