package com.gxl.test;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

/**
 * 动态注册bean
 * 
 * @author JohnGao
 */
@Component
public class RegisterBean implements ApplicationContextAware {
	public ApplicationContext aContext;
	private Logger logger = LoggerFactory.getLogger(RegisterBean.class);

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.aContext = applicationContext;
	}

	/**
	 * 动态注册bean
	 * 
	 * @author JohnGao
	 */
	public <T> void register(String beanName, Class<T> classType,
			Map<String, String> values) {
		ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) aContext;
		DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext
				.getBeanFactory();
		if (defaultListableBeanFactory.isBeanNameInUse(beanName)) {
			defaultListableBeanFactory.removeBeanDefinition(beanName);
			logger.info("beanName-->" + beanName + "成功删除");
		}
		BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
				.genericBeanDefinition(classType);
		for (String key : values.keySet())
			beanDefinitionBuilder.addPropertyValue(key, values.get(key));
		defaultListableBeanFactory.registerBeanDefinition(beanName,
				beanDefinitionBuilder.getRawBeanDefinition());
		logger.info("beanName-->" + beanName + "成功注册");
	}
}