同样在AbstractAutowireCapableBeanFactory 类中,initializeBean()方法实现为容器创建的Bean实例对象添加BeanPostProcessor 后置处理器,源码如下:

//初始容器创建的Bean实例对象,为其添加BeanPostProcessor后置处理器
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {//JDK的安全机制验证权限if (System.getSecurityManager() != null) {//实现PrivilegedAction接口的匿名内部类AccessController.doPrivileged((PrivilegedAction<Object>) () -> {invokeAwareMethods(beanName, bean);return null;}, getAccessControlContext());}else {//为Bean实例对象包装相关属性,如名称,类加载器,所属容器等信息invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;//对BeanPostProcessor后置处理器的postProcessBeforeInitialization//回调方法的调用,为Bean实例初始化前做一些处理if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}//调用Bean实例对象初始化的方法,这个初始化方法是在Spring Bean定义配置//文件中通过init-method属性指定的try {invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}//对BeanPostProcessor后置处理器的postProcessAfterInitialization//回调方法的调用,为Bean实例初始化之后做一些处理if (mbd == null || !mbd.isSynthetic()) {wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;
}
//调用BeanPostProcessor后置处理器实例对象初始化之前的处理方法
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;//遍历容器为所创建的Bean添加的所有BeanPostProcessor后置处理器for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {//调用Bean实例所有的后置处理中的初始化前处理方法,为Bean实例对象在//初始化之前做一些自定义的处理操作Object current = beanProcessor.postProcessBeforeInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;
}
@Override
//调用BeanPostProcessor后置处理器实例对象初始化之后的处理方法
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;//遍历容器为所创建的Bean添加的所有BeanPostProcessor后置处理器for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {//调用Bean实例所有的后置处理中的初始化后处理方法,为Bean实例对象在//初始化之后做一些自定义的处理操作Object current = beanProcessor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result;
}

BeanPostProcessor 是一个接口,其初始化前的操作方法和初始化后的操作方法均委托其实现子类来实现,在Spring 中,BeanPostProcessor 的实现子类非常的多,分别完成不同的操作,如:AOP 面向切面编程的注册通知适配器、Bean 对象的数据校验、Bean 继承属性、方法的合并等等,我们以最简单的AOP 切面织入来简单了解其主要的功能。下面我们来分析其中一个创建AOP 代理对象的子类AbstractAutoProxyCreator 类。该类重写了postProcessAfterInitialization()方法。

initializeBean()方法为容器产生的Bean 实例对象添加BeanPostProcessor 后置处理器相关推荐

  1. IOC容器加载过程及Bean的生命周期和后置处理器

    SpringIOC 容器加载过程 第一步:实例化化容器:AnnotationConfigApplicationContext @Configuration @ComponentScan("c ...

  2. 02.IOC容器加载过程及Bean的生命周期和后置处理器

    Spring思维导图 SpringBean加载流程 SpringIOC加载过程-invokeBeanFactoryPostProcessors SpringIOC 容器加载过程 第一步:实例化化容器: ...

  3. Spring容器创建流程(4)调用beanFactory后置处理器

    postProcessBeanFactory() 方法留给子类去实现. invokeBeanFactoryPostProcessors() 调用bean工厂的后置处理器(以前的执行流程可在系列文章中查 ...

  4. AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器

    BeanPostProcessor 后置处理器的调用发生在Spring IOC 容器完成对Bean 实例对象的创建和属性的依赖注入完成之后,在对Spring 依赖注入的源码分析过程中我们知道,当应用程 ...

  5. Spring学习笔记八--Bean生命周期和后置处理器

    为什么80%的码农都做不了架构师?>>>    Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...

  6. Spring中Bean的后置处理器

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-post-processors.html: Bean后置处理器 BeanPostProce ...

  7. Spring Bean 后置处理器PostProcessor

    BeanPostProcessor 接口定义回调方法,可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.可以在 Spring 容器通过插入一个或多个 BeanPostProcessor 的实现来完 ...

  8. Spring Bean 后置处理器

    转载自  Spring Bean 后置处理器 Spring--Bean 后置处理器 BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.你也可 ...

  9. 工厂Bean 的实现类getObject 方法创建Bean 实例对象

    FactoryBean 的实现类有非常多,比如:Proxy.RMI.JNDI.ServletContextFactoryBean 等等,FactoryBean 接口为Spring 容器提供了一个很好的 ...

最新文章

  1. Vim使用技巧及基本命令分类
  2. Python基础 2
  3. MOCTF-Web-我想要钱
  4. ai无法启动产品_启动AI启动的三个关键教训
  5. CentOS7 正确安装mysql(亲测)
  6. mbed试玩—高速开发MCU应用(基于FRDM-KL25Z)
  7. 南华大学计算机学院吴取劲,一种基于图深度优先搜索的基本路径集自动生成优化算法-南华大学学报.PDF...
  8. 看风水用什么罗盘最好_兰花用什么土最好
  9. Liferay 6.2 改造系列之十三:修改用户编辑页面表单内容
  10. 【windows】python打包后多进程引发的无限循环启动
  11. Keras:我的第一个LSTM二分类网络模型
  12. E1. Divisible Numbers (easy version)(数学)
  13. Unity初级案例-愤怒的小鸟:六:17把粒子系统显示在UI之前+18让星星一颗一颗的显示+19添加暂停动画
  14. 哎我就不信了,Java IO有这么难吗?
  15. 从 git 的历史记录中彻底删除文件或文件夹
  16. NATO(北大西洋公约组织)采用ADOBE FLEX作为作战支持系统
  17. 替换加密(恺撒加密法)
  18. 五天搞定英语语法系列汇总
  19. 微信Android客户端架构演进之路
  20. veni vidi vici密钥我的生日ACIGS解密_25人在同一天生日!男女比例又是多少?阳光新生大数据来了!...

热门文章

  1. inetd的工作流程
  2. DataTable的Ajax使用
  3. 2017-2018-1 20155222 201552228 实验五 通讯协议设计
  4. 写了一阵子多线程之后需要注意的几点
  5. Java并发编程的艺术,解读并发编程的优缺点
  6. 在同一基准下对前端框架进行比较(2019年更新)
  7. 小程序上传图片到七牛云(支持多张上传,预览,删除)
  8. 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
  9. Netty使用Marshalling传输信息
  10. UGUIAnimator模块知识点随记