this();//这里会创建beanFactory
//读取注解的Bean读取器
//这里会加载6个默认bean的定义信息
this.reader = new AnnotatedBeanDefinitionReader(this);
/**
* 创建BeanDefinition扫描器
* 可以用来扫描包或者类,继而转换为bd
*
* spring默认的扫描包不是这个scanner对象
* spring在执行工程后置处理器ConfigurationClassPostProcessor时,去扫描包时会new一个ClassPathBeanDefinitionScanner
*
* 这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext对象的scan方法
*
*/
this.scanner = new ClassPathBeanDefinitionScanner(this);
//Bean定义注册中心注册bean的定义信息
register(componentClasses);
refresh();
//刷新前的预处理
prepareRefresh();
//初始化一些属性设置,子类自定义个性化的属性设置
initPropertySources();
//检验属性的合法性
getEnvironment().validateRequiredProperties();
//保存容器中一些早期的事件
this.earlyApplicationEvents = new LinkedHashSet<>();
//获取bean工厂
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
//刷新和创建bean工厂
refreshBeanFactory();
//AnnotationConfigApplicationContext是GenericApplicationContext的子类
//前面的this()会创建一个this.beanFactory = new DefaultListableBeanFactory();
//设置序列化id
this.beanFactory.setSerializationId(getId());
//返回GenericApplicationContext创建的BeanFactory对象
return getBeanFactory();
//BeanFactory的预准备工作
prepareBeanFactory(beanFactory);
//1.设置BeanFactory的类加载器、支持表达式解析器...
//2.添加部分BeanPostProcessor【ApplicationContextAwareProcessor等】的实例
//3.设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware...等
//4.注册可以解析的自动装配:我们能注解在任何组件中自动注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
//5.添加beanPostProcessor【ApplicationListenerDetector】的实例
//6.添加编译时的AspectJ
//7.给beanFactory中注册一些能用的组件
//beanFactory准备工作完成后进行的后置处理工作
postProcessBeanFactory(beanFactory);
//子类通过重写postProcessBeanFactory方法来在beanFactory创建并预准备完成后来做进一步的设置
//执行BeanFactoryPostProcessors,beanFacotry的后置处理器
//两个接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
//执行BeanFactoryPostProcessors的方法
//这里会解析注解以及加载bean的定义信息
invokeBeanFactoryPostProcessors(beanFactory);
//1.获取所有的BeanDefinitionRegistryPostProcessor
//2.按优先级执行BeanDefinitionRegistryPostProcessors
//3.再按优先级执行BeanFactoryPostProcessors
//按优先级注册BeanPostProcessor的实例,用来拦截bean的创建过程
registerBeanPostProcessors(beanFactory);
//不同接口类型BeanPostProcessor,在bean创建前后的执行时机是不一样的
//BeanPostProcessor
//DestructionAwareBeanPostProcessor
//MergedBeanDefinitionPostProcessor:在registerBeanPostProcessors(beanFactory);中最后注册
//InstantiationAwareBeanPostProcessor
//SmartInstantiationAwareBeanPostProcessor
//注册一个ApplicationListenerDetector,来在bean创建完成后检查是否是ApplicationListener,如果是则this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);放到容器中
//初始化MessageSource组件(做国际化功能、消息绑定、消息解析)
initMessageSource();
//获取BeanFacotry
//看容器中是否有id为messageSource的组件,如果有则赋值给属性,如果没有则自己创建一个DelegatingMessageSource
//MessageSource主要用于取出国际化配置文件中的某个key的值,能按照区域信息获取
//把MessageSource注册到容器中beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);,以后可以自动注入
//初始化事件派发器
initApplicationEventMulticaster();
//获取BeanFacotry
//从BeanFacotry中获取applicationEventMulticaster的ApplicationEventMulticaster
//如果上一步没有配置就创建一个SimpleApplicationEventMulticaster
//注册到容器中beanFactory.registerSingleton()
//留给子容器(子类)
//子类重写这个方法,在容器刷新的时候可以自定义逻辑
onRefresh();
//把所有项目里面的ApplicationListener注册进来
registerListeners();
//1.从容器中拿到ApplicationListener类型的组件添加到派发器中
//2.派发之前步骤产生的事件
//初始化所有的剩下的单实例bean
finishBeanFactoryInitialization(beanFactory);
//初始化剩下的单实例bean
beanFactory.preInstantiateSingletons();
//1.获取容器中的所有Bean,依次进行初始化和创建对象
//2.获取Bean的定义信息:RootBeanDefinition
//3.Bean不是抽象的,是单实例的,不是懒加载的
//是否是factoryBean,即是否是实现FactoryBean定义接口的bean
//不是factoryBean,利用getBean(beanName)创建对象
//getBean(beanName)
//doGetBean(name, null, null, false)
//先从缓存中获取Bean,如果能获取到,说明之前已经被创建过(所有创建过的单实例Bean都会被缓存起来)
//缓存中获取不到,后面会开始Bean的创建对象流程
//标记当前Bean已经被创建 markBeanAsCreated(beanName);
//获取Bean的定义信息 getMergedLocalBeanDefinition(beanName);
//获取当前Bean依赖的其它Bean,如果有,按照getBean()把依赖的Bean先创建出来 BeanString[] dependsOn = mbd.getDependsOn();
//启动单实例Bean的创建流程
createBean(beanName, mbd, args);
//让BeanPostProcessro【InstantiationAwareBeanPostProcessor】先拦截尝试返回代理对象
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
//触发Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
//如果有返回值再触发 postProcessAfterInitialization
//如果前面没有返回代理对象,就执行下面一步创建一个对象
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
//利用工厂方法或者对象的构造器创建出Bean实例
instanceWrapper = createBeanInstance(beanName, mbd, args);
//调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
//Bean属性赋值
populateBean(beanName, mbd, instanceWrapper);
//赋值之前:
//1.拿到InstantiationAwareBeanPostProcessor后置处理器执行postProcessAfterInstantiation方法
ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
//2.这才是真的赋值:在执行InstantiationAwareBeanPostProcessor的postProcessProperties
ibp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName)
//3.应用Bean属性的值:为属性利用setter方法等进行赋值
applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
//bean的初始化
initializeBean(beanName, exposedObject, mbd);
//1.执行XXXAware接口的方法:BeanNameAware/BeanClassLoaderAware/BeanFactoryAware
invokeAwareMethods(beanName, bean);
//2.执行后置处理器初始化之前的操作postProcessBeforeInitialization(result, beanName)
applyBeanPostProcessorsBeforeInitialization(bean, beanName);
//3.这里才是真的的初始化:执行初始化方法
invokeInitMethods(beanName, wrappedBean, mbd);
//(1)是否是InitializingBean接口的实现,是执行接口规定的初始化方法
//(2)是否自定义初始化方法
//4.执行后置处理器的applyBeanPostProcessorsAfterInitialization方法
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
//注册bean的销毁方法
registerDisposableBeanIfNecessary()