spring 之 BeanPostProcessor

粗略一看, 它有这么多实现:

可见, 它是多么基础 而重要的一个 接口啊! 它提供了两个方法:

public interface BeanPostProcessor {Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}

两个方法的名字 都是  postProcessXxxInitialization 的格式, 不是 Before 就是 After,  都是围绕 process Initialization  这个过程来做文章的。  当然, 我有一点不明白的是, 为什么  这里有个post, post作为前缀有 在... 之后的意思(http://skill.qsbdc.com/cigencizhui/328.html),但是在这里,和Before一起使用, 有些难以理解。

如果我们自定义的class 实现了 这个接口,  那么它会在每一个 bean 的实例化前后 各被调用一次。 参见AbstractAutowireCapableBeanFactory 源码:

    public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException {Object result = existingBean;Iterator var4 = this.getBeanPostProcessors().iterator();do {if(!var4.hasNext()) {return result;}BeanPostProcessor beanProcessor = (BeanPostProcessor)var4.next();result = beanProcessor.postProcessBeforeInitialization(result, beanName);  // 前处理} while(result != null);return result;}public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {Object result = existingBean;Iterator var4 = this.getBeanPostProcessors().iterator();do {if(!var4.hasNext()) {return result;}BeanPostProcessor beanProcessor = (BeanPostProcessor)var4.next();result = beanProcessor.postProcessAfterInitialization(result, beanName);// 后处理} while(result != null);return result;}

这两个方法都是在初始化bean 的时候被调用的:

    protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {if(System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction() {public Object run() {AbstractAutowireCapableBeanFactory.this.invokeAwareMethods(beanName, bean);return null;}}, this.getAccessControlContext());} else {this.invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if(mbd == null || !mbd.isSynthetic()) {wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName); // 前处理}try {this.invokeInitMethods(beanName, wrappedBean, mbd);} catch (Throwable var6) {throw new BeanCreationException(mbd != null?mbd.getResourceDescription():null, beanName, "Invocation of init method failed", var6);}if(mbd == null || !mbd.isSynthetic()) {wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);//  后处理}return wrappedBean;}

posted on 2017-11-12 02:39 CanntBelieve 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/FlyAway2013/p/7820713.html

spring 之 BeanPostProcessor相关推荐

  1. 【Spring】Spring中BeanPostProcessor

    1.概述 转载:Spring中BeanPostProcessor 对文章:SpringBoot : 定制化Bean的利器:BeanPostProcessor & BeanFactoryPost ...

  2. Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用

    写博客,写博客,把自己知道的小知识点全部记录,? BeanDefinitionRegistryPostProcessor 接口属于Beanddefination  装配定义的范畴,此时bean 并没有 ...

  3. Spring中BeanPostProcessor

    Spring提供了很多扩展接口,BeanPostProcessor接口和InstantiationAwareBeanPostProcessor接口就是其中两个. BeanPostProcessor B ...

  4. Spring之BeanPostProcessor(后置处理器)介绍

      为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor   该接口我们也叫后置处理器,作用是在Be ...

  5. 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程

    postProcessBeforeInitialization 在init方法之前调用 postProcessAfterInitialization 在init方法之后调用 package com.C ...

  6. Spring中BeanPostProcessor 执行过程

    1.刷新容器 2.在refresh()方法中 执行 // Instantiate all remaining (non-lazy-init) singletons. // 初始化剩下的非延迟加载(no ...

  7. 面试官:讲讲Spring框架Bean的加载过程

    spring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典.优秀的框架,它的复杂程度往往令人望而却步. 不过作为朝夕相处的框架,我们必须得明白一个问题就是spri ...

  8. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)

    摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...

  9. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

最新文章

  1. 一步一步写算法(之prim算法 中)
  2. vue数据源转json问题
  3. linux图形化卡在开机界面,linux怎么在开机时进入图形界面
  4. 我和“限速”之间的纠缠(一)
  5. CLR Via CSharp读书笔记(7):常量和字段
  6. 5G通信的一些关键技术
  7. Linux如何清除last信息,linux清除last、lastb和history记录
  8. android标题栏上增加按钮,Android:向自定义标题栏添加按钮
  9. INFO: task java:27465 blocked for more than 120 seconds不一定是cache太大的问题
  10. 四种模式、五大架构 规划企业物联网蓝图
  11. Leaflet制作专题图
  12. 几种基本的约束和外键(一对一 多对多 多对一)级联关系
  13. 两性关系的50个经典客观规律
  14. Python爬虫Scrapy轮子工具
  15. 一名新入职程序员2019的摸爬滚打
  16. 旅行商问题的蚁群算法
  17. 金字塔池化模型PPM-Pyramid pooling module
  18. win10能够正常访问网站、ip正常ping通,但是ping域名显示”请求找不到主机......“
  19. F81E657Se-SL
  20. speechSynthesis强制使用Chrome中的Google小姐中文语音

热门文章

  1. solarflare低延迟网卡_动态丨赛灵思收购solarflare,数据优先是重要布局
  2. docker 容器 增删改查
  3. javacript 数据类型
  4. MongoDB SQL
  5. python pillow库下载_054-python库Pillow
  6. Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门
  7. ldo和dcdc功耗_深度解析DCDC和LDO各自的原理和区别
  8. php携程 线程,携程api开发解决方法
  9. WebService学习总结(三)——使用JDK开发WebService
  10. 【译】理解JavaScript闭包——新手指南