package com.easyooo.framework.configure;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.util.StringUtils;
/**
* 根据配置创建Spring 能识别的<code>BeanDefineition对象</code>
*
* 创建的Bean对象,不支持有依赖的Bean
*
* @author Killer
*/
public abstract class BeanDefinitionFactory {
static final String ID = "id";
/**
* 根据Bean信息创建 Spring BeanDefinition
*
* 参数的BeanClass是必须设置的,其次ID等属性是可选的
* Properties也是可选择
*
* @param beanInfo
* @return
*/
public static BeanDefinitionHolder createBeanDefinition(BeanCreateInfo beanInfo){
if(beanInfo == null || beanInfo.getBeanClass() == null){
return null;
}
BeanDefinitionBuilder builder = BeanDefinitionBuilder.
rootBeanDefinition(beanInfo.getBeanClass());
BeanDefinition definition = builder.getBeanDefinition();
if(!StringUtils.isEmpty(beanInfo.getBeanId())){
definition.setAttribute(ID, beanInfo.getBeanId());
}
if(beanInfo.getAttributes() != null){
Map<String, Object> attrs = beanInfo.getAttributes();
Set<String> keySet = attrs.keySet();
for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
String key = iterator.next();
definition.setAttribute(key, attrs.get(key));
}
}
if(beanInfo.getProperties() != null){
Properties props = beanInfo.getProperties();
Set<Object> keySet = props.keySet();
for (Iterator<?> iterator = keySet.iterator(); iterator.hasNext();) {
Object key = iterator.next();
builder.addPropertyValue(key.toString(), props.get(key));
}
}
return new BeanDefinitionHolder(builder.getBeanDefinition(),
beanInfo.getBeanId());
}
/**
* 批量创建BeanDefinition
* @param multiBean
* @return
*/
public static List<BeanDefinitionHolder> createMultiBeanDefinition(List<BeanCreateInfo> multiBean){
if(multiBean == null){
return null;
}
List<BeanDefinitionHolder> multiTarget = new ArrayList<>();
for (BeanCreateInfo create : multiBean) {
BeanDefinitionHolder bd = createBeanDefinition(create);
if(bd != null){
multiTarget.add(bd);
}
}
return multiTarget;
}
}