import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @author wenlong
*/
public class SpringBootBeanUtils {
/**
* 主動向Spring容器中註冊bean
*
* @param applicationContext Spring容器
* @param name BeanName
* @param clazz 註冊的bean的類性
* @param args 構造方法的必要參數,順序和類型要求和clazz中定義的一致
* @param <T>
* @return 返回註冊到容器中的bean對象
*/
public static <T> T registerBean(ConfigurableApplicationContext applicationContext, String name, Class<T> clazz,
Object... args) {
if(applicationContext.containsBean(name)) {
Object bean = applicationContext.getBean(name);
if (bean.getClass().isAssignableFrom(clazz)) {
return (T) bean;
} else {
throw new RuntimeException("BeanName 重複 " + name);
}
}
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
for (Object arg : args) {
beanDefinitionBuilder.addConstructorArgValue(arg);
}
BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.registerBeanDefinition(name, beanDefinition);
return applicationContext.getBean(name, clazz);
}
public static void removeBean(ConfigurableApplicationContext applicationContext, Class<T> cls){
String name = cls.getSimpleName();
name = name.replaceFirst(name.substring(0,1), name.substring(0,1).toLowerCase());
removeBean(applicationContext, name);
}
public static void removeBean(ConfigurableApplicationContext applicationContext, String beanName){
BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
beanFactory.removeBeanDefinition(beanName);
}
}