spring创建bean以及Aop的执行时机

Spring的完整流程图如下


15854876-4d3e161994d39557.jpg
spring的完整流程图.jpg
15854876-d7e3ce052aa4fce0.png
SpringAop与生命周期.png

解析自定义标签


15854876-9c4e56dc13c064f8.png
image.png

具体代码流程如下

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

猜你喜欢

转载自blog.csdn.net/weixin_34313182/article/details/87165513
今日推荐