Spring BeanFactoryPostProcessor

Demo

  1. public class ChangeAttrBeanPostProcessor implements BeanFactoryPostProcessor {
  2. private Set<String> attr;
  3. public ChangeAttrBeanPostProcessor() {
  4. attr = new HashSet<>();
  5. }
  6. public Set<String> getAttr() {
  7. return attr;
  8. }
  9. public void setAttr(Set<String> attr) {
  10. this.attr = attr;
  11. }
  12. @Override
  13. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  14. String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
  15. for (String beanName : beanDefinitionNames) {
  16. BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
  17. StringValueResolver stringValueResolver = new StringValueResolver() {
  18. @Override
  19. public String resolveStringValue(String strVal) {
  20. if (attr.contains(strVal)) {
  21. return "隐藏属性";
  22. }
  23. else {
  24. return strVal;
  25. }
  26. }
  27. };
  28. BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(stringValueResolver);
  29. visitor.visitBeanDefinition(beanDefinition);
  30. }
  31. }
  32. }
  1. public class BeanFactoryPostProcessorSourceCode {
  2. public static void main(String[] args) {
  3. ApplicationContext context = new ClassPathXmlApplicationContext("BeanFactoryPostProcessor-demo.xml");
  4. Apple apple = context.getBean("apple", Apple.class);
  5. System.out.println(apple);
  6. }
  7. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="removeAttrBeanPostProcessor"
  6. class="com.huifer.source.spring.beanPostProcessor.ChangeAttrBeanPostProcessor">
  7. <property name="attr">
  8. <set>
  9. <value>hc</value>
  10. </set>
  11. </property>
  12. </bean>
  13. <bean id="apple" class="com.huifer.source.spring.bean.Apple">
  14. <property name="name" value="hc"/>
  15. </bean>
  16. </beans>

初始化

  • org.springframework.context.support.AbstractApplicationContext#refresh

    1. invokeBeanFactoryPostProcessors(beanFactory);
    1. protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    2. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    3. // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
    4. // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
    5. if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
    6. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
    7. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
    8. }
    9. }
  • org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List<org.springframework.beans.factory.config.BeanFactoryPostProcessor>)

    1. public static void invokeBeanFactoryPostProcessors(
    2. ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    3. // Invoke BeanDefinitionRegistryPostProcessors first, if any.
    4. Set<String> processedBeans = new HashSet<>();
    5. // 判断是否为BeanDefinitionRegistry类
    6. if (beanFactory instanceof BeanDefinitionRegistry) {
    7. BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
    8. // 存放 BeanFactoryPostProcessor
    9. List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
    10. // 存放 BeanDefinitionRegistryPostProcessor
    11. List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    12. // 2.首先处理入参中的beanFactoryPostProcessors
    13. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
    14. // 判断是否是BeanDefinitionRegistryPostProcessor
    15. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
    16. BeanDefinitionRegistryPostProcessor registryProcessor =
    17. (BeanDefinitionRegistryPostProcessor) postProcessor;
    18. //
    19. registryProcessor.postProcessBeanDefinitionRegistry(registry);
    20. // BeanDefinitionRegistryPostProcessor 添加
    21. // 执行 postProcessBeanFactory
    22. registryProcessors.add(registryProcessor);
    23. }
    24. // 这部分else 内容就是 BeanFactoryPostProcessor
    25. else {
    26. // BeanFactoryPostProcessor 添加
    27. regularPostProcessors.add(postProcessor);
    28. }
    29. }
    30. // Do not initialize FactoryBeans here: We need to leave all regular beans
    31. // uninitialized to let the bean factory post-processors apply to them!
    32. // Separate between BeanDefinitionRegistryPostProcessors that implement
    33. // PriorityOrdered, Ordered, and the rest.
    34. List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    35. // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
    36. /**
    37. * 调用实现{@link PriorityOrdered}\{@link BeanDefinitionRegistryPostProcessor}
    38. * todo: 2020年1月16日 解析方法
    39. * {@link DefaultListableBeanFactory#getBeanNamesForType(java.lang.Class, boolean, boolean)}
    40. */
    41. String[] postProcessorNames =
    42. beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    43. for (String ppName : postProcessorNames) {
    44. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    45. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    46. processedBeans.add(ppName);
    47. }
    48. }
    49. // 排序Order
    50. sortPostProcessors(currentRegistryProcessors, beanFactory);
    51. registryProcessors.addAll(currentRegistryProcessors);
    52. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    53. currentRegistryProcessors.clear();
    54. // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
    55. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    56. for (String ppName : postProcessorNames) {
    57. if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
    58. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    59. processedBeans.add(ppName);
    60. }
    61. }
    62. sortPostProcessors(currentRegistryProcessors, beanFactory);
    63. registryProcessors.addAll(currentRegistryProcessors);
    64. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    65. currentRegistryProcessors.clear();
    66. // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
    67. boolean reiterate = true;
    68. while (reiterate) {
    69. reiterate = false;
    70. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
    71. for (String ppName : postProcessorNames) {
    72. if (!processedBeans.contains(ppName)) {
    73. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
    74. processedBeans.add(ppName);
    75. reiterate = true;
    76. }
    77. }
    78. sortPostProcessors(currentRegistryProcessors, beanFactory);
    79. registryProcessors.addAll(currentRegistryProcessors);
    80. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
    81. currentRegistryProcessors.clear();
    82. }
    83. // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
    84. invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
    85. invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    86. } else {
    87. // Invoke factory processors registered with the context instance.
    88. invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
    89. }
    90. // Do not initialize FactoryBeans here: We need to leave all regular beans
    91. // uninitialized to let the bean factory post-processors apply to them!
    92. // 配置文件中的 BeanFactoryPostProcessor 处理
    93. String[] postProcessorNames =
    94. beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    95. // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
    96. // Ordered, and the rest.
    97. List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
    98. List<String> orderedPostProcessorNames = new ArrayList<>();
    99. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
    100. for (String ppName : postProcessorNames) {
    101. if (processedBeans.contains(ppName)) {
    102. // skip - already processed in first phase above
    103. // 处理过的跳过
    104. } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
    105. priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
    106. } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
    107. orderedPostProcessorNames.add(ppName);
    108. } else {
    109. nonOrderedPostProcessorNames.add(ppName);
    110. }
    111. }
    112. // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
    113. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
    114. invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    115. // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
    116. List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
    117. for (String postProcessorName : orderedPostProcessorNames) {
    118. orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    119. }
    120. sortPostProcessors(orderedPostProcessors, beanFactory);
    121. invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    122. // Finally, invoke all other BeanFactoryPostProcessors.
    123. // 配置文件中自定义的 BeanFactoryPostProcessor 注册
    124. List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
    125. for (String postProcessorName : nonOrderedPostProcessorNames) {
    126. nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
    127. }
    128. invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    129. // Clear cached merged bean definitions since the post-processors might have
    130. // modified the original metadata, e.g. replacing placeholders in values...
    131. beanFactory.clearMetadataCache();
    132. }

image-20200119085346675

image-20200119085655734

InstantiationAwareBeanPostProcessor

  1. protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  2. PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
  3. }
  1. public static void registerBeanPostProcessors(
  2. ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
  3. // 获取 BeanPostProcessor
  4. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
  5. // Register BeanPostProcessorChecker that logs an info message when
  6. // a bean is created during BeanPostProcessor instantiation, i.e. when
  7. // a bean is not eligible for getting processed by all BeanPostProcessors.
  8. // 获取数量
  9. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  10. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
  11. // Separate between BeanPostProcessors that implement PriorityOrdered,
  12. // Ordered, and the rest.
  13. // BeanPostProcessor 通过PriorityOrdered保证顺序
  14. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
  15. // MergedBeanDefinitionPostProcessor
  16. List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
  17. // 有序的 BeanPostProcessor
  18. List<String> orderedPostProcessorNames = new ArrayList<>();
  19. // 无序的 BeanPostProcessor
  20. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
  21. for (String ppName : postProcessorNames) {
  22. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
  23. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  24. priorityOrderedPostProcessors.add(pp);
  25. // 类型判断放入相应的list
  26. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  27. internalPostProcessors.add(pp);
  28. }
  29. }
  30. else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
  31. orderedPostProcessorNames.add(ppName);
  32. }
  33. else {
  34. nonOrderedPostProcessorNames.add(ppName);
  35. }
  36. }
  37. // First, register the BeanPostProcessors that implement PriorityOrdered.
  38. /**
  39. * 有{@link org.springframework.core.annotation.Order} 相关操作
  40. */
  41. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
  42. // 注册 BeanPostProcessor 和 PriorityOrdered 实现
  43. registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
  44. // Next, register the BeanPostProcessors that implement Ordered.
  45. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
  46. for (String ppName : orderedPostProcessorNames) {
  47. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  48. orderedPostProcessors.add(pp);
  49. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  50. internalPostProcessors.add(pp);
  51. }
  52. }
  53. sortPostProcessors(orderedPostProcessors, beanFactory);
  54. // 注册 实现Order 和 BeanPostProcessor
  55. registerBeanPostProcessors(beanFactory, orderedPostProcessors);
  56. // Now, register all regular BeanPostProcessors.
  57. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
  58. for (String ppName : nonOrderedPostProcessorNames) {
  59. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  60. nonOrderedPostProcessors.add(pp);
  61. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  62. internalPostProcessors.add(pp);
  63. }
  64. }
  65. // 注册无序的 BeanPostProcessor
  66. registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
  67. // Finally, re-register all internal BeanPostProcessors.
  68. sortPostProcessors(internalPostProcessors, beanFactory);
  69. // 注册 MergedBeanDefinitionPostProcessor
  70. registerBeanPostProcessors(beanFactory, internalPostProcessors);
  71. // Re-register post-processor for detecting inner beans as ApplicationListeners,
  72. // moving it to the end of the processor chain (for picking up proxies etc).
  73. // 添加 ApplicationListenerDetector
  74. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  75. }
  • 测试用 Bean
  1. public class DemoInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
  2. @Override
  3. public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  4. System.out.println("init bean beanClass = " + beanClass.getSimpleName() + " beanName = " + beanName);
  5. return null;
  6. }
  7. }
  • 按照笔者的注释,可以知道DemoInstantiationAwareBeanPostProcessor 这个类是一个无序 Bean

image-20200119101026726

image-20200119101017989

  • 注册方法信息截图

image-20200119101107820

使用阶段(调用阶段)

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])中有如下代码

  1. Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
  1. @Nullable
  2. protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
  3. Object bean = null;
  4. if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
  5. // Make sure bean class is actually resolved at this point.
  6. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
  7. Class<?> targetType = determineTargetType(beanName, mbd);
  8. if (targetType != null) {
  9. /**
  10. * 主要实现{@link org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(java.lang.Class, java.lang.String)}
  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. }
  • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
  1. @Nullable
  2. protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
  3. for (BeanPostProcessor bp : getBeanPostProcessors()) {
  4. if (bp instanceof InstantiationAwareBeanPostProcessor) {
  5. InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
  6. // 调用自定义实现
  7. Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
  8. if (result != null) {
  9. return result;
  10. }
  11. }
  12. }
  13. return null;
  14. }

这个地方已经可以看到InstantiationAwareBeanPostProcessor出现了,并且调用了方法postProcessBeforeInstantiation,此处就可以调用我们的自定义方法了

image-20200119101516591