看spring源碼,搞明白流程,最終還是要知道spring中有哪些可以擴展的地方。流程是死的,擴展點是活的,在不修改源碼的前提下,只有搞明白spring有哪些擴展點,才能根據需求靈活的完成編碼工作。
BeanFactory構造階段
有一個NamespaceHandler可擴展的地方。
NamespaceHandler
通過自定義的NamespaceHandler,配合BeanDefinitionParser,可以完成自定義Bean的組裝操作,對於BeanDefinition的數據結構,進行個性化創建。

紅線處是MyBatis的NamespaceHandler,和原始的接口名重了而已。(MyBatis的Mapper接口BeanDefination掃描,還可以使用MapperScannerConfigurer,在BeanFactoryPostProcessor執行中、Bean實例化前實現)
Dubbo在spring中的使用,就有NamespaceHandler的身影。
還有目前常用的component-scan,也是利用ComponentScanBeanDefinitionParser完成了指定包下所有類的掃描,BeanDefinition創建的過程。
ApplicationContext構造階段
有兩個可擴展的地方:BeanFactoryPostProcessor,BeanPostProcessor。
BeanFactoryPostProcessor
擁有一個接口方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
實現BeanFactoryPostProcessor的Bean,ApplicationContext會提前實例化,並使用BeanFactoryPostProcessor對BeanFactory中的BeanDefinition進行變化修改,或者創建BeanDefinition到BeanFactory中。



比如PropertyPlaceholderConfigurer可將property-placeholder中的配置文件信息替換到BeanDefinition中。
比如ConfigurationClassPostProcessor發現BeanFactory中使用了@Configuration注解的Bean,並根據此Bean在BeanFactory中增加Bean。
比如MyBatis中使用的MapperScannerConfigurer,掃描basePackage配置下的接口,生成多個Bean並注冊到BeanFactory中。
BeanPostProcessor
擁有兩個接口方法:
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
分別在Bean實例初始化之前和之后執行,可自定義修改Bean實例,甚至替換Bean實例為自定義實例。

此外還有四個接口繼承了BeanPostProcessor接口。
DestructionAwareBeanPostProcessor
接口有一個方法,在實例銷毀前使用。
InstantiationAwareBeanPostProcessor
接口有三個方法,兩個在實例創建前后(不是初始化前后)使用,一個是在populateBean變量注入時使用。
Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException; boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException; PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
- 其中實例創建前后使用的接口,可檢查是否已使用AOP代理創建了實例。並返回創建的實例,之后的Bean實例創建步驟便不會繼續執行了。
- 變量注入使用的接口,可實現@Autowired注解的注入。
注:常見的AbstractAutoProxyCreator真正產生代理實例的地方是在postProcessAfterInitialization中,AOP也是通過此種方式和IOC過程連接起來的。http://www.ithao123.cn/content-6051885.html
SmartInstantiationAwareBeanPostProcessor
接口有三個方法,在實例創建前智能判斷實例類型,智能判斷構造函數,獲取預創建實例,防止循環依賴。
實現了InstantiationAwareBeanPostProcessor接口的類,基本都實現了SmartInstantiationAwareBeanPostProcessor接口。
MergedBeanDefinitionPostProcessor
接口有一個方法,在實例創建前,修改合並BeanDefinition。
看了一下幾個實現類,除了調用BeanDefinition.registerExternallyManagedDestroyMethod方法外,沒有修改過BeanDefinition的其他內容。
