加载spring上下文涉及三个步骤:this(),reigister(componentClasses),refresh()
this()方法
1.隐式调用父类的构造方法,初始化一个bean工厂 DefaultListableBeanFactory
2.会在AnnotatedBeanDefinitionReader注入一些后置处理器
org.springframework.context.annotation.internalConfigurationAnnotationProcessor(ConfigurationClassPostProcessor很重要的一个)
org.springframework.context.annotation.internalAutowiredAnnotationProcessor(跟属性填充相关)
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
以ConfigurationClassPostProcessor为例子:
所以 DefaultListableBeanFactory就是容器,里面放着beanDefinitionMap,beanDefinitionNames,beanDefinitionMap是一个hashMap,beanName作为Key,beanDefinition作为Value,beanDefinitionNames是一个集合,里面存放了beanName。
AnnotationConfigApplicationContext的依赖图
DefaultListableBeanFacotry类图
reigister(componentClasses)
AnnotatedBeanDefinitionReader的doRegisterBean方法,把传入的类进行注册,可以注册多个。 spring会把带@Configuration的成为Full类--此处进行注册,不带@Configuration的称为Lite类。
最终调用org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(String, BeanDefinition)的 将配置类注册
经历了register放法后,自己的配置类,注册进来:
此时spring里面除了内置的类,有了我们自己的bean,也就是我们自己的配置类而且spring还没有开始扫描,只是实例化了一个工厂 。而且singletonObjects没有东西。
refresh()
3.1 invokeBeanFactoryPostProcessors(beanFactory)
最终调用的org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory, List<BeanFactoryPostProcessor>)方法:
这个方法里面主要处理BeanDefinitionRegistryPostProcessors和BeanFactoryPostProcessor。
将BeanDefinitionRegistryPostProcessors分为PriorigyOrdered,Ordered and the rest的,然后依次调用invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);由于BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor,所以会在最后调用invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
在这个里面 最重要的一个就是ConfigurationClassPostProcessor:
它会真正的处理解析配置类
处理步骤:
1. 获取所有的beanName,然后循环遍历 找出@Configuration标注的类,此处我们找到了MainConfig.
2.设置BeanName的生成方式,并实例化配置类的解析器ConfigurationClassParser
3.循环遍历所有的配置类,完成解析
处理@Component @PropertySource @ComponentScan @ComponentScans
@Import @ImportResource
最后调用invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
此时还是只有ConfigurationClassPostProcessor,Configuration标注的配置类,会创建CGLIB代理 ,同时增加一个BeanPostProcessor:ImportAwareBeanPostProcessor
enhanceConfigurationClasses(beanFactory):
执行完后,发现:
将BeanFactoryPostProcessors 也按照PriorityOrdered ,Ordered and the rest区分开来,依次调用invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
此处只有一个EventListenerMethodProcessor:
此时BeanFactory里面还没有我们自己的Bean:
3.2 registerBeanPostProcessors(beanFactory);
注册BeanPostProcessor---CommonAnnotationBeanPostProcessor 和AutowiredAnnotationBeanPostProcessor 同时增加了一个BeanPostProcessorChecker
执行完后BeanPostProcessor为:
3.3 finishBeanFactoryInitialization(beanFactory); 实例化所有的非懒加载单例be an
目前一级缓存中的:
遍历所有的beanName, 判断是否可以实例化,通过getBean方法最终调用到
doGetBean, 会先从singleton中先获取(一级缓存),对于一些内置类 直接从一级缓存中能够获取到。
获取不到的话,就执行createBean
最终会调用org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String, RootBeanDefinition, Object[]) 完成实例化,属性赋值 和 初始化。这期间会执行很多BeanPostProcessor.
doCreateBean之前,调用resolveBeforeInstantiation---这里会完成AOP的Advisor的解析和缓存(org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(Class<?>, String))。
doCreateBean里面:
createBeanInstance(beanName, mbd, args);--实例化调用反射
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(String, RootBeanDefinition, BeanWrapper)---属性赋值
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(String, Object, RootBeanDefinition)---完成初始化
总结bean的生命周期:
1.实例化Bean对象,这个时候Bean的对象是非常低级的,基本不能够被我们使用,因为连最基本的属性都没有设置,可以理解为连Autowired注解都是没有解析的;
2.填充属性,当做完这一步,Bean对象基本是完整的了,可以理解为Autowired注解已经解析完毕,依赖注入完成了;
3.如果Bean实现了BeanNameAware接口,则调用setBeanName方法;
4.如果Bean实现了BeanClassLoaderAware接口,则调用setBeanClassLoader方法;
5.如果Bean实现了BeanFactoryAware接口,则调用setBeanFactory方法;
6.调用BeanPostProcessor的postProcessBeforeInitialization方法;
7.如果Bean实现了InitializingBean接口,调用afterPropertiesSet方法;
8.如果Bean定义了init-method方法,则调用Bean的init-method方法;
9.调用BeanPostProcessor的postProcessAfterInitialization方法;当进行到这一步,Bean已经被准备就绪了,一直停留在应用的上下文中,直到被销毁;
10.如果应用的上下文被销毁了,如果Bean实现了DisposableBean接口,则调用destroy方法,如果Bean定义了destory-method,声明了销毁方法也会被调用
它会真正