一、流程图

  

spring 控制函数调用频次 spring调用流程_代理类

二、入口
  在Spring中实现控制反转的是IoC容器,实现方法是依赖注入DI(Dependency Injection,DI),整个过程必然存在一个入口,可以是xml文件,也可以是纯注解,也可以是混合使用。
  1)使用xml

ApplicationContext context = new ClassPathXmlApplicationContext("myBean.xml");
MyBean myBean = context.getBean("myBean", MyBean.class);
myBean.getMethod("zhangsan",1);

  2)使用注解

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(StartConfig.class);
applicationContext.refresh();
MyBean myBean = context.getBean("myBean", MyBean.class);
myBean.getMethod("zhangsan",1);

  3)spring boot

SpringApplication.run(StartConfig.class, args);

  2)和3)都是注解扫描,注解来自于StartConfig.class,在BeanFactoryPostProcessor阶段会解析,解析所有扫描到Bean

三、AbstractApplicationContext上下文

  是 ApplicationContext 的抽象实现类,该抽象类实现应用上下文的一些具体操作,提供refresh()方法完成IOC整个流程,在这个过程中创建了BeanFactory,记录了容器的状态。其子类实现了对BeanFactory的获取,可以操作Bean。

  

spring 控制函数调用频次 spring调用流程_spring 控制函数调用频次_02

四、BeanFactoryPostProcessor

  取出BeanDefinition中所有实现了BeanFactoryPostProcessor或者其子接口BeanDefinitionRegistryPostProcessor的Bean,优先执行BeanDefinitionRegistryPostProcessor中的方法,其最重要的实现类ConfigurationClassPostProcessor,实现了对注解的解析@Component,@PropertySources,@PropertySource,@ComponentScans,@ComponentScan,@Import,@ImportResource,@Bean,将所有解析到的类加入BeanDefinition方便后续实例化。

  

spring 控制函数调用频次 spring调用流程_代理类_03

五、BeanFactory

  最重要的实现类DefaultListableBeanFactory,管理Bean的整个生命周期,从准备->创建->使用->销毁,提供所有的方法。在BeanFatory中有五个重要属性:

  beanDefinitionMap:存放了Bean的定义信息,为Bean的创建提供必要信息

  beanDefinitionNames:在创建过程中,循环遍历该集合,依次创建

  singletonObjects:存放了已经完成的单例Bean对象

  earlySingletonObjects:存放未完成属性复制的对象,但是被其他对象应用,并赋值的对象。例如:对象A创建过程中注入了B对象,而B对象未创建,这时需要放下A对象去创建B对象,而B对象也引用了A对象,这时会将三级缓存中的A对象取出,判断是否实现AOP,并放入二级缓存。

  singletonFactories:在对象实例化后,先将lambda表达式存放其中。作为临时存放。

六、BeanPostProcessor
  
在使用之前已将所有继承BeanPostProcessor的Bean创建完成,这些Bean对其他所有普通Bean起作用,符合条件的会执行提供postProcessBeforeInitialization方法和postProcessAfterInitialization方法,拦截了Bean对象初始化之前和初始化之后,完成这个过程后,将Bean对象返会保存在一级缓存中,将二级三级缓存删除。

  其中代理类:AspectJAwareAdvisorAutoProxyCreator 或AnnotationAwareAspectJAutoProxyCreator完成了对对象的代理。

  

spring 控制函数调用频次 spring调用流程_xml_04

七、AOP执行流程

  在postProcessAfterInitialization中完成了对Bean的动态代理,这时候代理对象存放在一级缓存中,代理Bean中包含两个重要属性:MethodInterceptor方法拦截器和CallBack数组,数组的第一位是MethodInterceptor,代理对象继承了父类所有属性。

  当在代理类中对方法的调用会执行DynamicAdvisedInterceptor.intercept(),然后对所有advice做筛选,选出符合规则的,通过责任链模式依次调用方法执行。

  

spring 控制函数调用频次 spring调用流程_实例化_05

spring 控制函数调用频次 spring调用流程_实例化_06