createBeanInstance()采用反射生成实例对象,进行到这里表示对象还并未进行属性的填充,也就是@Autowired注解的属性还未得到注入
addSingletonFactory()将对象提前暴露,未进行属性填充的对象会放到三级缓存
singletonFactories
中
populateBean()对使用到了注入属性的注解就会进行注入,如果在注入的过程发现注入的对象还没生成,则会跑去生产要注入的对象
invokeAwareMethods()调用实现Aware接口的方法
BeanNameAware, BeanClassLoaderAware, BeanFactoryAware
applyBeanPostProcessorsBeforeInitialization()调用实现BeanPostProcessor接口的前置方法
如果有类实现了BeanPostProcessor接口,就会执行postProcessBeforeInitialization方法,这里需要注意的是:如果多个类实现BeanPostProcessor接口,那么多个实现类都会执行postProcessBeforeInitialization方法,可以看到是for循环依次执行的,还有一个注意的点就是如果加载A类的单例到spring容器中,A类也重写了BeanPostProcessor接口的postProcessBeforeInitialization方法,这时要注意A类的postProcessBeforeInitialization方法并不会得到执行,因为A类的单例还未加载完成,还未完全放到spring的singletonObjects一级缓存中。
再看一个注意的点
可以看到ApplicationContextAwareProcessor也实现了BeanPostProcessor接口,重写了postProcessBeforeInitialization方法,方法里面并调用了invokeAwareInterfaces方法,而invokeAwareInterfaces方法也写着如果实现了众多的Aware接口,则会依次执行相应的方法EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware, ApplicationStartupAware, ApplicationContextAware
invokeInitMethods()如果实现了InitializingBean接口,重写了afterPropertiesSet方法,则会调用afterPropertiesSet方法,最后还会调用是否指定了init-method,可以通过标签,或者@Bean注解的initMethod指定
applyBeanPostProcessorsAfterInitialization()调用实现BeanPostProcessor接口的后置方法,和before一样也是for循环遍历