spring源码阅读(二)--ioc容器加载(四)--postProcessBeanFactory(beanFactory);

直接上代码

//预留的bean工厂的后置处理器,注意 这里并没有去调用
postProcessBeanFactory(beanFactory);
	
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	//空方法,留给子类去实现
}

如何使用?

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		GenericBeanDefinition car = (GenericBeanDefinition)beanFactory.getBeanDefinition("car");
		//通过BeanFactoryPostProcessor将单例改成多例模式
		car.setScope("prototype");
		//改变参数值
		ConstructorArgumentValues values = new ConstructorArgumentValues();
		values.addIndexedArgumentValue(0,"测试");
		car.setConstructorArgumentValues(values);

	}
}

接下来就是调用beanFactory的后置处理器

/**
* 该方法用我们的bean工厂的后置处理器,
 * 1.可以让程序员用代码的方式类将指定的类注册到容器中  postProcessBeanDefinitionRegistry throws BeansException
 * 2.可以定注册到工厂里的bean定义进行控制修改,postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
 * 		2.1 BeanDefinitionRegistry提供了以下几个方法对bean定义进行修改,我们可以通过这些方法来操作bean的定义,判断,注册和反注册等
* 			2.1.1   registerBeanDefinition(String beanName, BeanDefinition beanDefinition)  //修改bean的定义信息
* 					removeBeanDefinition(String beanName)  //根据bean的名称删除bean定义
* 					boolean containsBeanDefinition(String beanName)  //是否某个bean的定义
* 					BeanDefinition getBeanDefinition(String beanName) //获取某个bean的定义
* 					String[] getBeanDefinitionNames()  //获取所有bean定义的名称
* 					int getBeanDefinitionCount() //获取bean定义的个数
* 					boolean isBeanNameInUse(String beanName) //这个bean的名称是否正在被使用
*/
invokeBeanFactoryPostProcessors(beanFactory);



protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		//挨个调用BeanFactory的后置处理器
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		// 还是对aop的支持
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值