參照Spring IOC 源碼,BeanDefinition 加載以及注冊的流程
解析標(biāo)簽階段<aop:config>標(biāo)簽為例子(注冊BeanPostProcessor)
org.springframework.context.support.AbstractApplicationContext#refresh
org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory
org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory
org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory)
org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.xml.XmlBeanDefinitionReader)
org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.Resource...)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.Resource)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.support.EncodedResource)
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadBeanDefinitions
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#registerBeanDefinitions
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#registerBeanDefinitions
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseBeanDefinitions
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseCustomElement(org.w3c.dom.Element)
org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseCustomElement(org.w3c.dom.Element, org.springframework.beans.factory.config.BeanDefinition)
org.springframework.beans.factory.xml.NamespaceHandlerSupport#parse
org.springframework.aop.config.ConfigBeanDefinitionParser#parse
org.springframework.aop.config.ConfigBeanDefinitionParser#configureAutoProxyCreator
org.springframework.aop.config.AopNamespaceUtils#registerAspectJAutoProxyCreatorIfNecessary
org.springframework.aop.config.AopConfigUtils#registerAspectJAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition
實(shí)例化Bean階段 (執(zhí)行BeanPostProcessors接口的postProcessAfterInitialization方法)
org.springframework.context.support.AbstractApplicationContext#refresh
org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class<T>)
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
總結(jié)
解析標(biāo)簽階段
如圖在解析標(biāo)簽階段,注冊了一個AspectJAwareAdvisorAutoProxyCreator宪彩, AspectJAwareAdvisorAutoProxyCreator是一個實(shí)現(xiàn)了BeanPostProcessor的類睁壁。
它在IOC執(zhí)行總體的位置如下。
實(shí)例化Bean階段
在實(shí)例化Bean的階段,獲取BeanPostProcessor堕虹,并且執(zhí)行岂津。所以執(zhí)行了AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization虱黄。所以Spring AOP的入口是在AspectJAwareAdvisorAutoProxyCreator.postProcessAfterInitialization()方法(父類)
它在IOC執(zhí)行總體的位置如下。