1、Spring在启动的时候需要在xml、注解、JavaConfig中找到需要被Spring管理的Bean信息。随后,会将这些信息封装成BeanDefinition,最后会把这些信息放到一个beanDefinitionMap中,我记得这个Map的key是beanName,value则是BeanDefinition对象,到这里其实就是把定义的元数据加载起来,目前真实对象还没实例化
2、接着会遍历beanDefinitionMap,执行BeanFactoryPostProcessor这个Bean工厂后置处理器的逻辑,比如说,我们平时定义的占位符信息,就是通过BeanFactoryPostProcessor的子类PropertyPlaceholderConfigurer进行注入进去。当然了,这里我们也可以自定义BeanFactoryPostProcessor来对我们定义好的Bean元数据进行获取或者修改,只是一般我们不会这样干,实际上也很少有这样的使用场景
3、BeanFactoryPostProcessor后置处理器执行完之后,就到了实例化对象了,在Spring里面是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化,但这里把对象实例化,只是把对象给创建出来,而对象具体得属性是还没注入的。比如我的对象是UserService,而UserService对象依赖着SendService对象,这个时候的SendService还是null的,所以,下一步就是把对象的相关属性给注入
4、相关属性注入完之后,往下接着就是初始化的工作了,首先判断该Bean是否实现了Aware相关的接口,如果存在则填充相关的资源,比如我这边在项目用到了:我希望通过代码程序的方式去获取指定的Spring Bean,我们会抽取成一个工具类,去实现ApplicationContextAware接口,来获取ApplicationContext对象进而获取Spring Bean
5、Aware相关的接口处理完之后,就会到BeanPostProcessor后置处理器,BeanPostProcessor后置处理器有两个方法,一个是before,一个是after(before先执行,after后执行)
6、这个BeanPostProcessor后置处理器是AOP实现的关键(关键子类AnnotatiionAwareAspectJAutoProxyCreator),所以,执行完Aware相关接口就会执行BeanPostProcessor相关子类的before方法。BeanPostProcessor相关子类的before方法执行完,则执行init相关的方法,比如说@PostConstruct、实现了InitializingBean接口、定义的init-method方法。当时我还去官网看他们的被调用执行顺序分别书@PostConstruct、实现了InitializingBean接口、定义的init-method方法。这些都是Spring给我们的扩展,像@PostConstruct我就经常用到
7、比如说:对象实例化后,我要做些初始化的相关工作或者就启个线程去kafka拉取数据,等到init方法执行完之后,就会执行BeanPostProcessor的after方法。基本重要的流程都走完了,我们可以获取到对象去使用了,销毁的时候看看有没有配置相关的destroy方法,执行就完事了