1.spring
容器擴展點
自定義的實例化管行、初始化厨埋、依賴裝配、依賴檢查等流程捐顷,既可以覆蓋默認的實例化荡陷,也可以增強初始化雨效、依賴注入、依賴檢查等流程
大體意思是可以檢查相應的標識接口完成一些自定義功能實現(xiàn)废赞,如包裝目標對象到代理對象徽龟。
1.第一個BeanPostProcessor擴展點 InstantiationAwareBeanPostProcessor
必須為InstantiationAwareBeanPostProcessor
的實現(xiàn)類。
作用是在 createBean 和 doCreateBean之間唉地,進行判斷据悔。
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
作用:
通過如上代碼可以進行實例化的預處理(自定義實例化bean,如創(chuàng)建相應的代理對象)和后處理(如進行自定義實例化的bean的依賴裝配)耘沼。
第二個 BeanPostProcessor
擴展點 SmartInstantiationAwareBeanPostProcessor
doCreateBean
里面
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
回調(diào)方法解析構造器,
通過SmartInstantiationAwareBeanPostProcessor
的determineCandidateConstructors
回調(diào)方法解析構造器极颓,第二個BeanPostProcessor擴展點,返回第一個解析成功(返回值不為null)的構造器組群嗤,如AutowiredAnnotationBeanPostProcessor
實現(xiàn)將自動掃描通過@Autowired/@Value
注解的構造器從而可以完成構造器注入
第三個BeanPostProcessor擴展點 MergedBeanDefinitionPostProcessor
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)
執(zhí)行bean定義的合并
第四個BeanPostProcessor擴展點 SmartInstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference菠隆;第四個BeanPostProcessor擴展點,當存在循環(huán)依賴時骚烧,通過該回調(diào)方法獲取及早暴露的Bean實例浸赫;
第五個BeanPostProcessor擴展點 populateBean(beanName, mbd, instanceWrapper)
填充屬性
(9.1闰围、InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation赃绊;第五個BeanPostProcessor擴展點,在實例化Bean之后羡榴,所有其他裝配邏輯之前執(zhí)行碧查,如果false將阻止其他的InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation的執(zhí)行和從(9.2到(9.5的執(zhí)行,通常返回true校仑;
(9.2忠售、autowireByName、autowireByType:根據(jù)名字和類型進行自動裝配迄沫,自動裝配的知識請參考【第三章】 DI 之 3.3 更多DI的知識 ——跟我學spring3 3.3.3 自動裝配稻扬;
(9.3、InstantiationAwareBeanPostProcessor的postProcessPropertyValues:第六個BeanPostProcessor擴展點羊瘩,完成其他定制的一些依賴注入泰佳,如AutowiredAnnotationBeanPostProcessor執(zhí)行@Autowired注解注入,CommonAnnotationBeanPostProcessor執(zhí)行@Resource等注解的注入尘吗,PersistenceAnnotationBeanPostProcessor執(zhí)行@ PersistenceContext等JPA注解的注入逝她,RequiredAnnotationBeanPostProcessor執(zhí)行@ Required注解的檢查等等,請參考【第十二章】零配置 之 12.2 注解實現(xiàn)Bean依賴注入 ——跟我學spring3睬捶;
(9.4黔宛、checkDependencies:依賴檢查,請參考【第三章】 DI 之 3.3 更多DI的知識 ——跟我學spring3 3.3.4 依賴檢查擒贸;
(9.5臀晃、applyPropertyValues:應用明確的setter屬性注入觉渴,請參考【第三章】 DI 之 3.1 DI的配置使用 ——跟我學spring3 ;
**(10****徽惋、exposedObject = initializeBean(beanName, exposedObject, mbd); **執(zhí)行初始化Bean流程疆拘;
(10.1、invokeAwareMethods(BeanNameAware寂曹、BeanClassLoaderAware哎迄、BeanFactoryAware):調(diào)用一些Aware標識接口注入如BeanName、BeanFactory隆圆;
(10.2漱挚、BeanPostProcessor的postProcessBeforeInitialization:第七個擴展點,在調(diào)用初始化之前完成一些定制的初始化任務渺氧,如BeanValidationPostProcessor完成JSR-303 @Valid注解Bean驗證旨涝,InitDestroyAnnotationBeanPostProcessor完成@PostConstruct注解的初始化方法調(diào)用,ApplicationContextAwareProcessor完成一些Aware接口的注入(如EnvironmentAware侣背、ResourceLoaderAware白华、ApplicationContextAware),其返回值將替代原始的Bean對象贩耐;
(10.3弧腥、invokeInitMethods : 調(diào)用初始化方法;
(10.3.1潮太、InitializingBean的afterPropertiesSet :調(diào)用InitializingBean的afterPropertiesSet回調(diào)方法管搪;
(10.3.2、通過xml指定的自定義init-method :調(diào)用通過xml配置的自定義init-method
(10.3.3铡买、BeanPostProcessor的postProcessAfterInitialization :第八個擴展點更鲁,AspectJAwareAdvisorAutoProxyCreator(完成xml風格的AOP配置(<aop:config>)的目標對象包裝到AOP代理對象)、AnnotationAwareAspectJAutoProxyCreator(完成@Aspectj注解風格(<aop:aspectj-autoproxy> @Aspect)的AOP配置的目標對象包裝到AOP代理對象)奇钞,其返回值將替代原始的Bean對象澡为;
(11、if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
……
} :如果是earlySingleExposure景埃,調(diào)用getSingle方法獲取Bean實例媒至;
earlySingleExposure =(mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName))
只要單例Bean且允許循環(huán)引用(默認true)且當前單例Bean正在創(chuàng)建中
(11.1、如果是earlySingletonExposure調(diào)用getSingleton將觸發(fā)【8】處ObjectFactory.getObject()的調(diào)用纠亚,通過【8.1】處的getEarlyBeanReference獲取相關Bean(如包裝目標對象的代理Bean)塘慕;(在循環(huán)引用Bean時可能引起Spring事務處理時自我調(diào)用的解決方案及一些實現(xiàn)方式的風險);
(12****蒂胞、registerDisposableBeanIfNecessary(beanName, bean, mbd) ****: 注冊Bean的銷毀方法(只有非原型Bean可注冊)图呢;
(12.1、單例Bean的銷毀流程
(12.1.1、DestructionAwareBeanPostProcessor的postProcessBeforeDestruction : 第九個擴展點蛤织,如InitDestroyAnnotationBeanPostProcessor完成@PreDestroy注解的銷毀方法注冊和調(diào)用赴叹;
(12.1.2、DisposableBean的destroy:注冊/調(diào)用DisposableBean的destroy銷毀方法指蚜;
(12.1.3乞巧、通過xml指定的自定義destroy-method : 注冊/調(diào)用通過XML指定的destroy-method銷毀方法;
(12.1.2摊鸡、Scope的registerDestructionCallback:注冊自定義的Scope的銷毀回調(diào)方法绽媒,如RequestScope、SessionScope等免猾;其流程和【12.1 單例Bean的銷毀流程一樣】是辕,關于自定義Scope請參考【第三章】 DI 之 3.4 Bean的作用域 ——跟我學spring3
(13****、到此Bean****實例化猎提、依賴注入获三、初始化完畢可以返回創(chuàng)建好的bean****了。
從上面的流程我們可以看到BeanPostProcessor一個使用了九個擴展點锨苏,其實還一個擴展點(SmartInstantiationAwareBeanPostProcessor的predictBeanType在下一篇介紹)疙教,接下來我們看看BeanPostProcessor這些擴展點都主要完成什么功能及常見的BeanPostProcessor。
我將在下一帖子中使用例子來解析這八個擴展點的主要功能伞租,及一些Spring默認提供的BeanPostProcessor主要作用贞谓。
歡迎大家一起探討學習。