從BeanFactory源碼看Bean的生命周期( 二 )


請注意,Aware被Bean實現,作用于單個Bean , BeanPostProcessor被注冊到Bean工廠中,作用于工廠中的每個Bean 。
實例化Bean&屬性設置#這圖里所描述的是,創建Bean時先從BeanDefinition開始,然后實例化Bean,在實例化前后,InstantiationAwareBeanPostProcessor會被調用 。
從BeanFactory源碼看Bean的生命周期

文章插圖
下面從doGetBean方法開始(getBean方法實際調用的方法 , 它已經是AbstractBeanFactory中的方法了),看下面的代碼需要注意,Spring中Bean的作用域可以分為Singleton、Prototype和其它,其中Singleton和Prototype是Spring框架原生支持的,其它作用域需要自行擴展,比如SpringWebMVC擴展了Session等作用域 。所以你看下面的代碼時也要在腦袋里把它們分成Singleton、Prototype和其它作用域,要不然你可能就被這很長很長的代碼搞迷糊了:
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {String beanName = transformedBeanName(name);Object beanInstance;// ...try {// 根據BeanName獲取BeanDefinition// MergedBeanDefinition是將它和它的祖先Bean整合,這里可以先忽略,就當作普通的BeanDefinitionRootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// 如果是Singleton,按Singleton的方法創建if (mbd.isSingleton()) {sharedInstance = getSingleton(beanName, () -> {try {// [+] 實際創建Beanreturn createBean(beanName, mbd, args);}catch (BeansException ex) {}});beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}// 如果是Prototype,按Prototype的方法創建else if (mbd.isPrototype()) {Object prototypeInstance = null;try {beforePrototypeCreation(beanName);// [+] 實際創建BeanprototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}// 如果是其它作用域,那么就放到其它作用域中創建// 這里的邏輯和Singleton很像,在Singleton創建中// Bean放到SingletonBeanRegistry中管理,而這個// 放到對應的作用域中管理else {String scopeName = mbd.getScope();Scope scope = this.scopes.get(scopeName);try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {// [+] 實際創建Beanreturn createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {}}}catch (BeansException ex) {}}return adaptBeanInstance(name, beanInstance, requiredType);}所以 , 不管是哪個作用域,它們都調用了createBean來創建Bean,AbstractBeanFactory中并沒有實現這個方法,createBeanAbstractAutowireCapableBeanFactory抽象類實現的:
@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {RootBeanDefinition mbdToUse = mbd;try {// 在Bean實例化之前 , 讓一些關心實例化階段的BeanPostProcessor得到執行Object bean = resolveBeforeInstantiation(beanName, mbdToUse);// 如果返回的bean不是null,那么結束整個階段,直接返回這個值作為beanif (bean != null) {return bean;}}catch (Throwable ex) {}try {// 實例化BeanObject beanInstance = doCreateBean(beanName, mbdToUse, args);return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {}catch (Throwable ex) {}}所以,resolveBeforeInstantiation方法應該就是查找那些InstantiationAwareBeanPostProcessor,然后調用它們 。
InstantiationAwareBeanPostProcessor的before hook#protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {Class<?> targetType = determineTargetType(beanName, mbd);if (targetType != null) {// 應用BeanPostProcessor的beforeInstantiationbean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);if (bean != null) {// 調用BeanPostProcessors的初始化后方法,注意是初始化后不是實例化后// 前提是before方法返回了一個對象bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved = (bean != null);}return bean;}我們可以看到,這個方法的代碼非常簡單,雖然還沒寫明 , 但是99%就是調用所有的InstantiationAwareBeanPostProcessor了,兩個apply應該就是做這個工作的 。我們不妨點進去看一個:

推薦閱讀