package com.spring.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;

import com.spring.bean.PersonBean;

/**
 * 允许在正常的BeanFactoryPostProcessor检测开始之前注册更多的自定义bean。
 * 特别是,BeanDefinitionRegistryPostProcessor可以注册更多的bean定义,然后定义BeanFactoryPostProcessor实例。
 * 也就是说可以借此方法实现自定义的bean。
 *
 */
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

	}

	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
		System.out.println("postProcessBeanDefinitionRegistry");
		Class<?> cls = PersonBean.class;
		BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(cls);
		GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
		definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
		definition.getPropertyValues().add("name", "pepsi02");
		// 注册bean名,一般为类名首字母小写
		registry.registerBeanDefinition("person2", definition);

		BeanDefinition beanDefinition = registry.getBeanDefinition("person1");
		System.out.println("postProcessBeanDefinitionRegistry修改属性name值");
		beanDefinition.getPropertyValues().add("name", "tom");
	}

}