spring源码——后置处理器

后置处理器

Spring提供了两种后处理bean的扩展接⼝,分别为 BeanPostProcessor 和BeanFactoryPostProcessor,两者在使⽤上是有所区别的。
⼯⼚初始化(BeanFactory)—> Bean对象
在BeanFactory初始化之后可以使⽤BeanFactoryPostProcessor进⾏后置处理做⼀些事情
在Bean对象实例化(并不是Bean的整个⽣命周期完成)之后可以使⽤BeanPostProcessor进⾏后置处
理做⼀些事情
注意:对象不⼀定是springbean,⽽springbean⼀定是个对象
SpringBean的⽣命周期
其中基于注解注入时,BeanDefination就是借助BeanFactoryPostProcessor的实现类ConfigurationClassPostProcessor中的方法实现的。

自定义Bean后置处理器CustomBeanPostProcessor :

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
	
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println(beanName+"===postProcessBeforeInitialization");
		return null;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println(beanName+"===postProcessAfterInitialization");
		return null;
	}
}

在这个过程中我们可以获取到bean对象,可以在这个过程中介入spring对实例初始化的过程,来操作改变bean

注入到spring容器的类City:

@Component
public class City {

	public City(){
		System.out.println("==================City构造方法=======================");
	}

	public void test(){
		System.out.println(this.hashCode());
	}

}

测试类:

public class Test {
	
	@SuppressWarnings("resource")
	public static void main(String[] args)  {
		
		AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

		City city = annotationConfigApplicationContext.getBean(City.class);

				
	}

}

执行结果:

==================City构造方法=======================
city===postProcessBeforeInitialization
city===postProcessAfterInitialization

spring源码中也是大量借助后置处理器来完成bean初始化工作的
1.执行InstantiationAwareBeanPostProcessor 的postProcessBeforeInstantiation和postProcessAfterInitialization 在bean没有开始实例化之前执行
2.determineConstructorsFromBeanPostProcessors—SmartInstantiationAwareBeanPostProcessor–determineCandidateConstructors推断构造方法
3.applyMergedBeanDefinitionPostProcessors—MergedBeanDefinitionPostProcessor–postProcessMergedBeanDefinition 缓存注解信息
4.addSingletonFactory —SmartInstantiationAwareBeanPostProcessor—getEarlyBeanReference得到一个体现暴露的对象----对象不是bean(在spring容器当中,并且由sping自己产生的)
5.populateBean-----InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation判断你的bean需不需要完成属性填充
6.populateBean-------- InstantiationAwareBeanPostProcessor—postProcessPropertyValues属性填充—自动注入
7.BeanPostProcessor----postProcessBeforeInitialization 在bean初始方法化前调用
8.BeanPostProcessor----postProcessAfterInitialization在bean初始化方法后调用
9.destory

猜你喜欢

转载自blog.csdn.net/qq_23830637/article/details/103891224
今日推荐