Spring源码学习--BeanPostProcessor

灰太狼 2022-06-16 13:58 284阅读 0赞

BeanPostProcessor接口的作用是在Spring容器完成Bean实例化前后可以添加一些自己的逻辑处理,我们可以定义一个或者多个BeanPostProcessor接口的实现。

BeanPostProcessor接口提供了两个方法:

1、postProcessBeforeInitialization 可以对Bean在实例化之前添加一些逻辑处理

2、postProcessAfterInitialization 可以对bean在实例化之后添加一些逻辑处理

  1. public interface BeanPostProcessor {
  2. //可以对Bean在实例化之前添加一些逻辑处理
  3. Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
  4. //可以对bean在实例化之后添加一些逻辑处理
  5. Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
  6. }

简单示例MyBeanPostProcessor:

  1. public class MyBeanPostProcessor implements BeanPostProcessor {
  2. //Bean 实例化之前进行的处理
  3. public Object postProcessBeforeInitialization(Object bean, String beanName)
  4. throws BeansException {
  5. System.out.println("对象" + beanName + "开始实例化");
  6. return bean;
  7. }
  8. //Bean 实例化之后进行的处理
  9. public Object postProcessAfterInitialization(Object bean, String beanName)
  10. throws BeansException {
  11. System.out.println("对象" + beanName + "实例化完成");
  12. return bean;
  13. }
  14. }

在applicationContext.xml中添加配置

  1. <bean class="com.spring.test.di.MyBeanPostProcessor"/>

1、BeanPostProcessor保存到Spring容器

这样MyBeanPostProcessor就会添加到Spring的容器中,在Spring容器中会将所有实现BeanPostProcessor的bean保存起来,具体实现在AbstractApplicationContext的registerBeanPostProcessors中

  1. protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  2. //获取所有实现BeanPostProcessor的实现类
  3. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
  4. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  5. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
  6. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
  7. List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
  8. List<String> orderedPostProcessorNames = new ArrayList<String>();
  9. List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
  10. for (String ppName : postProcessorNames) {
  11. if (isTypeMatch(ppName, PriorityOrdered.class)) {
  12. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  13. //保存所有的BeanPostProcessor
  14. priorityOrderedPostProcessors.add(pp);
  15. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  16. internalPostProcessors.add(pp);
  17. }
  18. }
  19. else if (isTypeMatch(ppName, Ordered.class)) {
  20. orderedPostProcessorNames.add(ppName);
  21. }
  22. else {
  23. nonOrderedPostProcessorNames.add(ppName);
  24. }
  25. }
  26. OrderComparator.sort(priorityOrderedPostProcessors);
  27. //注册所有的BeanPostProcessor
  28. registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
  29. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
  30. for (String ppName : orderedPostProcessorNames) {
  31. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  32. orderedPostProcessors.add(pp);
  33. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  34. internalPostProcessors.add(pp);
  35. }
  36. }
  37. OrderComparator.sort(orderedPostProcessors);
  38. registerBeanPostProcessors(beanFactory, orderedPostProcessors);
  39. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
  40. for (String ppName : nonOrderedPostProcessorNames) {
  41. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  42. nonOrderedPostProcessors.add(pp);
  43. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  44. internalPostProcessors.add(pp);
  45. }
  46. }
  47. registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
  48. OrderComparator.sort(internalPostProcessors);
  49. registerBeanPostProcessors(beanFactory, internalPostProcessors);
  50. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector());
  51. }
  52. //在容器中添加BeanPostProcessor
  53. private void registerBeanPostProcessors(
  54. ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {
  55. for (BeanPostProcessor postProcessor : postProcessors) {
  56. beanFactory.addBeanPostProcessor(postProcessor);
  57. }
  58. }

2、执行所有的BeanPostProcessor

在Spring容器在初始化Bean前后都会执行所有的BeanPostProcessor的实现类提供的方法。

  1. public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
  2. throws BeansException {
  3. Object result = existingBean;
  4. //getBeanPostProcessors()获取所有的BeanPostProcessor的实现类
  5. for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
  6. //执行BeanPostProcessor实现类的方法
  7. result = beanProcessor.postProcessAfterInitialization(result, beanName);
  8. if (result == null) {
  9. return result;
  10. }
  11. }
  12. return result;
  13. }

![Image 1][]

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring学习

    一、先跟着博客一路debug下去。   期间可能会跟丢,但是请反复地debug下去(过程可能很痛苦,但是源码这关是绕不开的),能跟上博客,大致知道做了什么。 要懂得利用