Spring 源码梳理(三) 再谈BeanPostProcessor

原创 2016年08月29日 15:23:04

再谈BeanPostProcessor

上篇文章介绍的是BeanPostProcessor的用法,在最后留下了一个问题,对于Spring中的Bean属性'Lazy-init'(延迟加载),当Hook类(BeanPostProcessorApp)或被Hook的类(App)具有这个属性时,会有什么样的表现。

1.接着前面文章的已有的配置,首先我们分别在App和BeanPostProcessorApp上增加构造函数,并且打印一句话:

private App(){
		System.out.println("App.App()");
	}
private BeanPostProcessorApp(){
		System.out.println("BeanPostProcessorApp.BeanPostProcessorApp()");
	}

同时在BeanPostProcessorApp中增加一个after方法(上篇只用到了before):

public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		if(bean instanceof App){
			((App)bean).setSays("After:BeanPostProcessorApp");
		}
		return bean;
	}

然后执行BeanPostProcessorAppTest方法,打印的结果如下:

BeanPostProcessorApp.BeanPostProcessorApp()
App.App()
App.app():After:BeanPostProcessorApp


2.我们调式看一下三条信息分别在什么情况下产生:

1)刚才的第一条信息 “BeanPostProcessorApp.BeanPostProcessorApp() ”是在registerBeanPostProcessors()方法中产生的,也就是说该BeanPostProcessorApp的初始化是在所有BeanPostProcessor注册的时候就进行了。


而这个时候Bean的实例化还没有开始,所以得出这样的结论:

在实现BeanPostProcessor的接口的Bean中增加lazy-init属性是无效的,因为这个Bean在未进行初始化的时候已经被上面的registerBeanPostProcessors初始化了;结合本例,也就是说下面的写法是无效的:


2)再看第二条信息,因为没有设置lazy-init属性,所以在finishBeanFactoryInitialization()方法中就进行了初始化并且创建了实例,如下:


3)最后一条信息则是这样产生的,因为我们在注册BeanPostProcessor的时候已经把我们自己的BeanPostProcessorApp注册了,同时在执行finishBeanFactoryInitialization方法进行Bean的初始化的时候会执行org.springframework.beans.factory.support.AbstractBeanFactory中的getBean方法(上一篇已经介绍了),创建一个实例,进行真正的注入,而我们的

<span style="font-family:SimSun;">App app = (App)applicationContext.getBean("app");</span>

只是得到其中一个引用,最后打印信息。

3.上面分析的结论是,在实现BeanPostProcessor的接口的Bean中增加lazy-init属性是无效的,可以自己实例验证一下,这里就不贴上了;继续分析,如果我们给Bean App增加lazy-init这个属性呢?,如下:


我们可以猜测,因为加上lazy-init属性之后,就不会在Spring的初始化过程中实例化;在org.springframework.beans.factory.support.DefaultListableBeanFactory(上一篇提到过)中我们可以看到,实际上是没有执行org.springframework.beans.factory.support.AbstractBeanFactory的getBean方法:


而这个org.springframework.beans.factory.support.AbstractBeanFactory中的getBean方法实际上是执行了“实例化”+"BeanPostProcessor"这两个功能。

所以猜测1:加载完Spring配置文件不会有第二条信息。

由于我们写的getBean其实就是org.springframework.beans.factory.support.AbstractBeanFactory中的getBean,如下:


所以猜测2:执行完自己的getBean就会进行初始化,并且执行BeanPostProcessor的实现;

验证如下:


如上,证实了猜测1


如上图,在未执行第三个断点says方法之前,says的值已经改变,证实了猜测2.

版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring(11)——可用来修改bean对象的BeanPostProcessor

11 可用来修改bean对象的BeanPostProcessor11.1 简介BeanPostProcessor是Spring中定义的一个接口,其与之前介绍的InitializingBean和Disp...
  • elim168
  • elim168
  • 2017年07月26日 14:29
  • 2507

Spring BeanPostProcessor接口 (在Spring实例化bean的前后执行一些附加操作) .

在Spring实例化bean的前后执行一些附加操作。  有时,你会发现需要立刻在Spring实例化一个bean的前后执行一些附件操作。这些操作可以简单到修改一个bean,也可以复杂到返回一个完全...
  • tanksyg
  • tanksyg
  • 2013年01月30日 15:56
  • 6387

《玩转Spring》第二章 BeanPostProcessor扩展

上一章,介绍了如何扩展spring类实现自动读取配置文件。 这一章,我们介绍如何通过实现BeanPostProcessor接口,对容器中的Bean做一层代理,来满足我们的个性化需求。 一、基本原理...
  • shan9liang
  • shan9liang
  • 2014年06月25日 10:53
  • 9535

无处不在的扩展点BeanPostProcessor

无处不在的扩展点BeanPostProcessor     在spring创建bean的过程中,多次出现了BeanPostProcessor的身影,它们是怎么来的,可以怎么用?本文就对s...
  • hongxingxiaonan
  • hongxingxiaonan
  • 2015年11月17日 22:50
  • 4531

Spring源码分析之BeanPostProcessor接口和BeanFactoryPostProcessor接口方法不执行原因分析

首先下面是我的Bean /* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apach...
  • u011734144
  • u011734144
  • 2017年05月21日 18:53
  • 308

Spring源码学习笔记之一:从BeanPostProcesser开始

对Spring的源码之前没有系统的阅读过,现在有点时间正好仔细的学习一下。 我觉得带着问题去学习源码是速度比较快的一种方式,好过漫无目的的浏览,那样看起来也比较吃力。 第一部分就从BeanPostPr...
  • xuechongyang
  • xuechongyang
  • 2014年01月02日 18:27
  • 4141

再谈 内存对齐补齐--提高cpu检索周期效率

首先我们先看看下面的C语言的结构体: [cpp] view plain copy   typedef struct MemAlign   {   ...
  • vevenlcf
  • vevenlcf
  • 2016年06月30日 15:13
  • 554

使用BeanPostProcessor接口对受管Bean进行预处理

有时候,我们希望在Spring IoC容器初始化受管Bean之前、属性设置之后对该Bean先做一些预处理,或者在容器销毁受管Bean之前自己释放资源。那么该如何实现呢?Spring IoC为我们提供了...
  • xuechongyang
  • xuechongyang
  • 2013年12月30日 16:29
  • 1145

Spring的发布处理器(BeanPostProcessor)

BeanFactoryPostProcessor和BeanPostProcessor都是spring初始化bean的扩展点,两个接口非常相似。...
  • lzghxjt
  • lzghxjt
  • 2016年07月10日 10:27
  • 226

spring相关技术整理

这是spring官网上的项目列表 下面是其中部分说明: spring 顶级项目:  Spring AMQP:消息队列操作的工具包,主要是封装了RabbitMQ的操作。  Spr...
  • baochanghong
  • baochanghong
  • 2017年04月07日 11:35
  • 736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring 源码梳理(三) 再谈BeanPostProcessor
举报原因:
原因补充:

(最多只允许输入30个字)