直接上代码
//预留的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()));
}
}