spring BeanPostProcessor使用场景

AnnotationConfigApplicationContext(创建容器)
->refresh
   ->finishBeanFactoryInitialization
      ->preInstantiateSingletons
        ->getBean
	     ->doGetBean
		   ->createBean
		     ->doCreateBean
			    ->  this.populateBean(beanName, mbd, instanceWrapper);(类属性赋值)
                    this.initializeBean(beanName, exposedObject, mbd);(BeanPostProcessor postProcessBeforeInstantiation和postProcessAfterInstantiation执行)

一、populateBean方法内容以Autowired注解和AutowiredAnnotationBeanPostProcessor为例
spring BeanPostProcessor使用场景_第1张图片

populateBean 类属性赋值	
这种类型的InstantiationAwareBeanPostProcessor类负责给属性赋值
以AutowiredAnnotationBeanPostProcessor为例,@Autowired注解为属性赋值。
	执行 postProcessPropertyValues 
			->findAutowiringMetadata 
				 ->buildAutowiringMetadata 
				    ->findAutowiredAnnotation 获取bean属性上中有@Autowired注解的属性放入InjectionMetadata
				      ->InjectionMetadata.InjectedElement.inject 利用反射赋值

如果为InstantiationAwareBeanPostProcessor类型的类,则执行该类的postProcessPropertyValues方法。AutowiredAnnotationBeanPostProcessor继承了InstantiationAwareBeanPostProcessor在这里插入图片描述
还执行了实现了接口InstantiationAwareBeanPostProcessor的类的
postProcessAfterInstantiation方法。
spring BeanPostProcessor使用场景_第2张图片

二、initializeBean方法
spring BeanPostProcessor使用场景_第3张图片
1、执行invokeAwareMethods实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口的setXXX方法。spring BeanPostProcessor使用场景_第4张图片
2、循环调用实现了接口BeanPostProcessor的postProcessBeforeInitialization方法。
spring BeanPostProcessor使用场景_第5张图片
3、invokeInitMethods
执行init-method、postConstract注解的方法、afterPropertiesSet
4、循环遍历实现BeanPostProcessor接口的applyBeanPostProcessorsAfterInitialization方法。
spring BeanPostProcessor使用场景_第6张图片

你可能感兴趣的:(spring BeanPostProcessor使用场景)