红色标注的是spring相关的后处理器,在bean实例化过程的不一样时机调用相关的后处理接口spring
bean初始化大概分为5步:缓存
--------执行InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
1.执行构造方法
--------执行MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition(RootBeanDefinition mbd, Class<?> beanType, String beanName)
--------执行InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation(Object bean, String beanName)
--------执行InstantiationAwareBeanPostProcessor-postProcessPropertyValues
2.执行set 方法(或者是属性注解)
3.执行生命周期Aware接口方法,注入须要的对象
---------执行BeanPostProcessor-postProcessBeforeInitialization(Object bean, String beanName)
4.执行afterPropertiesSet
5.执行自定义的init-method方法
---------执行BeanPostProcessor-postProcessAfterInitialization(Object bean, String beanName)post
1.InstantiationAwareBeanPostProcessor--postProcessBeforeInstantiation实例化以前(构造方法执行以前)调用spa
做用:传入要实例化的对象的class,能够替换(偷梁换柱)成其余的class,好比一个代理的class代理
2.MergedBeanDefinitionPostProcessor--postProcessMergedBeanDefinition 构造方法调用以后执行对象
做用:合并class定义接口
使用场景:spring用来缓存属性注解信息,好比缓存属性注解信息@Autoware @Resouce 等,实现类 AutowiredAnnotationBeanPostProcessor生命周期
3.InstantiationAwareBeanPostProcessor-postProcessPropertyValues 设置属性值时调用it
做用:对属性信息进行一些处理io
使用场景:spring在第二个后处理时缓存了属性注解信息,这里就经过缓存取出注解信息,而后将对应的属性注入进去.实现类AutowiredAnnotationBeanPostProcessor
4.BeanPostProcessor--postProcessAfterInitialization对象已经实例化完(包括构造方法,属性注入,初始方法等)
做用:对象实例完成之后的后处理
场景:spring aop自动代理,用的就是postProcessAfterInitialization后处理 实现类AnnotationAwareAspectJAutoProxyCreator,经过这个回调,将实例化的对象产生一个代理对象返回