Spring的完整流程图如下
解析自定义标签
具体代码流程如下
prepareRefresh();
obtainFreshBeanFactory();
->org.springframework.context.support.AbstractApplicationContext#refreshBeanFactory
->org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory
->org.springframework.context.support.AbstractRefreshableApplicationContext#loadBeanDefinitions 创建BeanFactory 解析xml文件放入到BeanFactory中
->org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseBeanDefinitions 这里可以解析spring自己的标签,也可以解析自定义标签
prepareBeanFactory(beanFactory);
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);//这里先把aop组件注册进去 AbstractAutoProxyCreator#postProcessBeforeInstantiation 调用创建代理
//其它的如AutowiredAnnotationBeanPostProcessor 实现了Autowired依赖注入
//ImportAwareBeanPostProcessor实现了组件导入 springboot就用到了这个机制
org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors
>org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
>beanFactory.preInstantiateSingletons()
>org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
>org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
>org.springframework.beans.factory.support.AbstractBeanFactory#createBean
//Aop就是在这里实现的(resolveBeforeInstantiation),会调用AbstractAutoProxyCreator的postProcessBeforeInstantiation方法
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
注意这里是InstantiationAwareBeanPostProcessors的BeanPostProcessorsBeforeInstantiation()方法,与Initialization的区别
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 没有代理的话就执行该方法开始创建bean
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean 属性赋值
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean()
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods 可以让bean对象感知到spring容器的存在
实现了BeanNameAware,则可以获取bean对象在spring中的name
实现了BeanClassLoaderAware,则可以获取到类加载器
实现了BeanFactoryAware,则可以获取BeanFactory
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization 执行前置处理
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods 执行初始化方法
>bean instanceof InitializingBean如果实现了InitializingBean,则会执行afterPropertiesSet()方法 所以这里是个扩展点
>是否实现了初始化方法init-method() 代码中可以使用@PostConstruct注解 二者等价
>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization 执行后置处理
>org.springframework.beans.factory.support.AbstractBeanFactory#registerDisposableBeanIfNecessary 执行DestructionAwareBeanPostProcessors