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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值