Spring 开始调用 bean 后置处理器,都是在 createBean 的时候,逐一开始调用,每次都处理不同的业务逻辑

第一次调用:判断是否需要 AOP

第一次调用 BeanPostProcessor 的继承了 InstantiationAwareBeanPostProcessor 接口的AnnotationAwareAspectJAutoProxyCreator postProcessBeforeInstantiation 方法,是为了判断当前 bean 是否需要 AOP 代理,这里会提前找出那些不需要被代理的类,如:AppConfig,Aspect 等

  1. @Nullable
  2. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  3. Object bean = null;
  4. // 判断 实例化处理器是否已经开始工作
  5. if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
  6. // Make sure bean class is actually resolved at this point.
  7. // 是否不是一个合成类
  8. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  9. Class<?> targetType = determineTargetType(beanName, mbd);
  10. if (targetType != null) {
  11. // 判断是否需要被代理
  12. bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
  13. if (bean != null) {
  14. bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
  15. }
  16. }
  17. }
  18. mbd.beforeInstantiationResolved = (bean != null);
  19. }
  20. return bean;
  21. }
  22. @Nullable
  23. protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
  24. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  25. if (bp instanceof InstantiationAwareBeanPostProcessor) {
  26. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  27. // 调用后置处理器,如果开启了 @EnableAspectJAutoProxy
  28. // 就会调用 AnnotationAwareAspectJAutoProxyCreator 的 postProcessBeforeInstantiation
  29. Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
  30. if (result != null) {
  31. return result;
  32. }
  33. }
  34. }
  35. return null;
  36. }

第二次调用:推断构造方法

为创建 bean 做准备,开始推断构造方法:处理实现了 SmartInstantiationAwareBeanPostProcessor 接口的后置处理器 AutowiredAnnotationBeanPostProcessor determineCandidateConstructors 方法

  • 提供了多个合格的构造方法,包括无参构造方法:
    • ctors == null,会调用无参构造方法,因为 spring 不知道应该利用那个构造方法装配


  • 提供了一个构造方法,不是无参构造方法:
    • ctors != null,且 ctors = 1,会使用提供的构造方法,因为可以只能使用这个构造方法


  • 提供了多个合格的构造方法,不含无参构造方法,且没有将其都标明 @Autowired(required=false):
    • ctors != null,即 ctors > 1,会继续判断应该使用的方法,通常为参数值最长的方法


  • 提供了多个合格的构造方法,至少有一个标明了 @Autowired(required=false) 并且没有 @Autowired(required=true)
    • ctors != null,即 ctors > 1,会继续推断使用哪一个构造方法,通常为第一个解析到的构造方法


  • 提供了多个合格的构造方法,至少有一个标明了 @Autowired(required=true) 和 @Autowired(required=false)
    • 直接报异常:Invalid autowire-marked constructor
  1. if (instanceWrapper == null) {
  2. // ★★★ 关键代码:开始推断构造方法,并创建 bean
  3. // 实例化对象,这里是【第二次】调用后置处理器:SmartInstantiationAwareBeanPostProcessor
  4. instanceWrapper = createBeanInstance(beanName, mbd, args);
  5. }
  6. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  7. protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
  8. throws BeansException {
  9. if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
  10. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  11. if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
  12. SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
  13. // 推断构造方法
  14. Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
  15. if (ctors != null) {
  16. return ctors;
  17. }
  18. }
  19. }
  20. }
  21. return null;
  22. }

第三次调用:应用合并之后的 BD

调用后置处理器:调用实现了 MergedBeanDefinitionPostProcessor 接口的 AutowiredAnnotationBeanPostProcessor CommonAnnotationBeanPostProcessor 类的 postProcessMergedBeanDefinition 方法,这里仅仅将属性全部拿出来(包括父类),并进行缓存,并没有进行真正的注入,只是把需要注入的属性,放在一个 injectionMetadataCache Map 中保存起来其中 key = beanName, value = InjectionMetadata

  1. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
  2. protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {
  3. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  4. // 判断是不是 MergedBeanDefinitionPostProcessor 类型
  5. if (bp instanceof MergedBeanDefinitionPostProcessor) {
  6. MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
  7. /*
  8. 处理 @Resource
  9. CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition
  10. 1、调用父类的方法,查找所有生命周期回调方法:初始化和销毁
  11. 2、findResourceMetadata() => 查找需要注入的元数据(这里只会处理 @Resource 注解的 Member(字段,构造方法,普通方法))
  12. 3、checkConfigMembers() => 将 injectedElements 复制给 checkedElements(?为什么)
  13. 处理 @Autowired
  14. AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition
  15. 1、findAutowiringMetadata() => 查找需要注入的元数据(这里只会处理 @Autowired 和 @Value 注解的 Member(字段,构造方法,普通方法))
  16. 2、checkConfigMembers() => 将 injectedElements 复制给 checkedElements(?为什么)
  17. */
  18. bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
  19. }
  20. }
  21. }

第四次调用:解决循环依赖,提前暴露一个工厂

这里并不是真正的第四次,因为是一个 lambda 表达式,会在处理属性注入的时候,才开始执行,我们只是简单的说是第四次

调用实现了 SmartInstantiationAwareBeanPostProcessor 接口的 AbstractAutoProxyCreator 类的 getEarlyBeanReference 方法,提前把这个 bean 的 ObjectFactory 放入 singletonFactories 中,并从三级缓存删除 bean

  1. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
  2. protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
  3. Object exposedObject = bean;
  4. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  5. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  6. if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
  7. SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
  8. exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
  9. }
  10. }
  11. }
  12. return exposedObject;
  13. }

第五次调用:判断是否需要进行属性注入

特殊情况下如果不要属性注入,则在这一步进行,调用了实现 InstantiationAwareBeanPostProcessor 接口 postProcessAfterInstantiation 方法,返回 false 即表示不需要进行属性注入

  1. populateBean(beanName, mbd, instanceWrapper);
  2. // ★ 提供一个扩展点
  3. // 如果程序员提供一个类,实现了 InstantiationAwareBeanPostProcessor,
  4. // 并重写 postProcessAfterInstantiation 并返回 false,就不会完成属性注入
  5. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  6. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  7. if (bp instanceof InstantiationAwareBeanPostProcessor) {
  8. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  9. // 调用 postProcessAfterInstantiation 方法,判断是否进行属性填充
  10. if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
  11. // 只要有一个后置处理器返回 false,就不会进行属性填充
  12. continueWithPropertyPopulation = false;
  13. break;
  14. }
  15. }
  16. }
  17. }

第六次调用:进行属性填充

查找 @Autowired 或 @Resource 注解的属性或方法,进行属性注入,此处调用了实现了 InstantiationAwareBeanPostProcessor 接口的 AutowiredAnnotationBeanPostProcessor 类 或 CommonAnnotationBeanPostProcessor 类的 postProcessProperties 方法完成属性注入,如果存在循环依赖,则在注入时,会调用二级缓存中的工厂方法

  1. populateBean(beanName, mbd, instanceWrapper);
  2. // 调用后置处理器,完成属性填充
  3. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  4. if (bp instanceof InstantiationAwareBeanPostProcessor) {
  5. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  6. // ★★★ 关键代码:进行属性填充
  7. // CommonAnnotationBeanPostProcessor 完成对 @Resource 属性的注入
  8. // AutowiredAnnotationBeanPostProcessor 完成对 @Autowired 属性的注入
  9. PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
  10. if (pvsToUse == null) {
  11. if (filteredPds == null) {
  12. filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
  13. }
  14. pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
  15. if (pvsToUse == null) {
  16. return;
  17. }
  18. }
  19. pvs = pvsToUse;
  20. }
  21. }

第七次调用:调用 bean 生命周期方法

调用所有实现了 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法

  • ApplicationContextAwareProcessor 类,完成了 aware 方法的调用
  • InitDestroyBeanPostProcessor 接口的 CommonAnnotationBeanPostProcessor 类,完成 @PostConstructor 的调用


在第七次调用和第八次调用之间,完成了实现了 InitializingBean 接口的 afterPropertiesSet(),或指定了 init-method 方法的类

  1. exposedObject = initializeBean(beanName, exposedObject, mbd);
  2. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
  3. @Override
  4. public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
  5. throws BeansException {
  6. Object result = existingBean;
  7. // ★★★ 执行直接实现了 BeanPostProcessor 的实现类的 postProcessBeforeInitialization 方法
  8. // ★ 这里处理生命周期方法的实现类是 CommonAnnotationBeanPostProcessor 类的 postProcessBeforeInitialization 方法
  9. // ★ 这里处理 Aware 实现类的是 ApplicationContextAwareProcessor 类的 postProcessBeforeInitialization 方法
  10. for (BeanPostProcessor processor : getBeanPostProcessors()) {
  11. Object current = processor.postProcessBeforeInitialization(result, beanName);
  12. if (current == null) {
  13. return result;
  14. }
  15. result = current;
  16. }
  17. return result;
  18. }

第八次调用:执行对象的 AOP 代理

调用所有实现了 BeanPostProcessor 接口的 postProcessAfterInitialization 方法

  1. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
  2. @Override
  3. public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
  4. throws BeansException {
  5. Object result = existingBean;
  6. // 执行直接实现了 BeanPostProcessor 的类的 postProcessAfterInitialization 方法
  7. for (BeanPostProcessor processor : getBeanPostProcessors()) {
  8. Object current = processor.postProcessAfterInitialization(result, beanName);
  9. if (current == null) {
  10. return result;
  11. }
  12. result = current;
  13. }
  14. return result;
  15. }