?spring中 有一大堆Aware結(jié)尾接口,? 例如BeanFactoryAware,? ApplicationContextAware, ServletContextAware等
?在程序中 我們自定義的bean實現(xiàn)了 Aware相關(guān)接口? spring 通過回調(diào)? ?就可以獲得一些資源??
?比如說 我們的bean實現(xiàn)BeanFactoryAware? spring會在bean實例化(getBean)階段 回調(diào)該setBeanFactory方法?? 注入BeanFactory實例(也就是this)???
?spring? ?BeanFactoryAware 接口定義
[java]?view plain?copy
public?interface?BeanFactoryAware?{??
void?setBeanFactory(BeanFactory?beanFactory)?throws?BeansException;??
}??
?spring容器中的bean?實例化 是在AbstractBeanFactory getBean中發(fā)生
[java]?view plain?copy
public?Object?getBean(String?name,?Class?requiredType,?Object[]?args)?throws?BeansException?{??
return?doGetBean(name,?requiredType,?args,?false);??
}??
調(diào)用的 doGetBean 方法比較復(fù)雜? 簡單看看 創(chuàng)建單例這段
[java]?view plain?copy
protected?Object?doGetBean(??
final?String?name,?final?Class?requiredType,?final?Object[]?args,?boolean?typeCheckOnly)?throws?BeansException?{??
final?String?beanName?=?transformedBeanName(name);??
.................略//?Create?bean?instance.??
//bean的定義是不是單例???
if?(mbd.isSingleton())?{??
sharedInstance?=?getSingleton(beanName,new?ObjectFactory()?{??
public?Object?getObject()?throws?BeansException?{??
try?{??
//?是一個抽象方法??在子類AbstractAutowireCapableBeanFactory中實現(xiàn)??
return?createBean(beanName,?mbd,?args);??
????????????????????????}??
catch?(BeansException?ex)?{??
????????????????????????????destroySingleton(beanName);??
throw?ex;??
????????????????????????}??
????????????????????}??
????????????????});??
????????????????bean?=?getObjectForBeanInstance(sharedInstance,?name,?beanName,?mbd);??
????????????}??
????????.................略??
return?bean;??
????}??
AbstractAutowireCapableBeanFactory??createBean方法
[java]?view plain?copy
protected?Object?createBean(final?String?beanName,?final?RootBeanDefinition?mbd,?final?Object[]?args)??
throws?BeanCreationException?{??
????AccessControlContext?acc?=?AccessController.getContext();??
return?AccessController.doPrivileged(new?PrivilegedAction()?{??
public?Object?run()?{??
????????????.................略??
//關(guān)注doCreateBean方法??
????????????Object?beanInstance?=?doCreateBean(beanName,?mbd,?args);??
if?(logger.isDebugEnabled())?{??
logger.debug("Finished?creating?instance?of?bean?'"?+?beanName?+?"'");??
????????????}??
return?beanInstance;??
????????}??
????},?acc);??
}??
doCreateBean方法
[java]?view plain?copy
protected?Object?doCreateBean(final?String?beanName,?final?RootBeanDefinition?mbd,?final?Object[]?args)?{??
//?Instantiate?the?bean.??
BeanWrapper?instanceWrapper?=null;??
if?(mbd.isSingleton())?{??
instanceWrapper?=?(BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);??
????????}??
????????.................略??
//?Initialize?the?bean?instance.??
????????Object?exposedObject?=?bean;??
try?{??
????????????populateBean(beanName,?mbd,?instanceWrapper);??
//實現(xiàn)?*Aware部分接口,?InitializingBean接口??方法調(diào)用在此發(fā)生??
????????????exposedObject?=?initializeBean(beanName,?exposedObject,?mbd);??
????????}??
catch?(Throwable?ex)?{??
if?(ex?instanceof?BeanCreationException?&&?beanName.equals(((BeanCreationException)?ex).getBeanName()))?{??
throw?(BeanCreationException)?ex;??
????????????}??
else?{??
throw?new?BeanCreationException(mbd.getResourceDescription(),?beanName,?"Initialization?of?bean?failed",?ex);??
????????????}??
????????}??
????????.................略??
return?exposedObject;??
}??
initializeBean方法
[java]?view plain?copy
protected?Object?initializeBean(String?beanName,?Object?bean,?RootBeanDefinition?mbd)?{??
if?(bean?instanceof?BeanNameAware)?{??
????????((BeanNameAware)?bean).setBeanName(beanName);??
????}??
if?(bean?instanceof?BeanClassLoaderAware)?{??
????????((BeanClassLoaderAware)?bean).setBeanClassLoader(getBeanClassLoader());??
????}??
//?如果當前bean?是BeanFactoryAware的一個實例???
if?(bean?instanceof?BeanFactoryAware)?{??
//回調(diào)當前實例注入資源??
((BeanFactoryAware)?bean).setBeanFactory(this);??
????}??
????Object?wrappedBean?=?bean;??
if?(mbd?==?null?||?!mbd.isSynthetic())?{??
//BeanPostProcessor?接口??postProcessBeforeInitialization方法回調(diào)??
????????wrappedBean?=?applyBeanPostProcessorsBeforeInitialization(wrappedBean,?beanName);??
????}??
try?{??
//?實現(xiàn)InitializingBean接口??afterPropertiesSet方法調(diào)用??
????????invokeInitMethods(beanName,?wrappedBean,?mbd);??
????}??
catch?(Throwable?ex)?{??
throw?new?BeanCreationException(??
(mbd?!=null???mbd.getResourceDescription()?:?null),??
beanName,"Invocation?of?init?method?failed",?ex);??
????}??
if?(mbd?==?null?||?!mbd.isSynthetic())?{??
????????wrappedBean?=?applyBeanPostProcessorsAfterInitialization(wrappedBean,?beanName);??
????}??
return?wrappedBean;??
}??
Spring ?aware相關(guān)接口