一、流程图
二、入口
在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。
四、BeanFactoryPostProcessor
取出BeanDefinition中所有实现了BeanFactoryPostProcessor或者其子接口BeanDefinitionRegistryPostProcessor的Bean,优先执行BeanDefinitionRegistryPostProcessor中的方法,其最重要的实现类ConfigurationClassPostProcessor,实现了对注解的解析@Component,@PropertySources,@PropertySource,@ComponentScans,@ComponentScan,@Import,@ImportResource,@Bean,将所有解析到的类加入BeanDefinition方便后续实例化。
五、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完成了对对象的代理。
七、AOP执行流程
在postProcessAfterInitialization中完成了对Bean的动态代理,这时候代理对象存放在一级缓存中,代理Bean中包含两个重要属性:MethodInterceptor方法拦截器和CallBack数组,数组的第一位是MethodInterceptor,代理对象继承了父类所有属性。
当在代理类中对方法的调用会执行DynamicAdvisedInterceptor.intercept(),然后对所有advice做筛选,选出符合规则的,通过责任链模式依次调用方法执行。