Spring动态注册bean到容器

直接上代码:

public class BeanUtils implements ApplicationContextAware {

    protected static Logger logger = LoggerFactory.getLogger(BeanUtils.class);
    protected ApplicationContext applicationContext;

    protected DefaultListableBeanFactory beanFactory;


    public void init() {
        ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext;
        beanFactory = (DefaultListableBeanFactory) context.getBeanFactory();
    }

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

    //初始化
    protected DefaultListableBeanFactory initBeanFactory() {
        ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext;
        return (DefaultListableBeanFactory) context.getBeanFactory();
    }
}
/**
 * Created by zhangqidzq on 16/4/27.
 */
public class GenericBeanUtils extends BeanUtils {

    /**
     * 注册一个新的 bean,如果该beanName的值已存在,则直接返回
     *
     * @param genericBeanConfig
     */
    public void regGeneralBean(GenericBeanConfig genericBeanConfig) {
        if (null == beanFactory) {
            beanFactory = initBeanFactory();
        }
        if (applicationContext.containsBean(genericBeanConfig.getBeanName())) {
            return;
        }

        BeanDefinitionBuilder beanBuilder = buildGeneralBean(genericBeanConfig);
        registBean(genericBeanConfig.getBeanName(), beanBuilder);
    }

    /**
     * 获得已注册的bean
     *
     * @param beanName
     * @return
     */
    public Object getBean(String beanName) {
        try {
            return applicationContext.getBean(beanName);
        } catch (NoSuchBeanDefinitionException e) {
            return null;
        } catch (BeansException e) {
            return null;
        }
    }

    /**
     * 构建 bean
     *
     * @param genericBeanConfig
     * @return
     */
    private BeanDefinitionBuilder buildGeneralBean(GenericBeanConfig genericBeanConfig) {
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(genericBeanConfig.getBeanClass());
        beanDefinitionBuilder.setInitMethodName(genericBeanConfig.getInitMethod());

        Map<String, String> properties = genericBeanConfig.getPropertyMap();
        for (Map.Entry<String, String> entry : properties.entrySet()) {
            beanDefinitionBuilder.addPropertyValue(entry.getKey(), entry.getValue());
        }
        return beanDefinitionBuilder;
    }

    /**
     * 动态注册bean
     *
     * @param beanName
     * @param beanBuilder
     */
    private void registBean(String beanName, BeanDefinitionBuilder beanBuilder) {
        beanFactory.registerBeanDefinition(beanName, beanBuilder.getBeanDefinition());
    }


    /**
     * 向spring的beanFactory动态地装载bean
     *
     * @param configLocationString 要装载的bean所在的xml配置文件位置
     */
    public void loadBean(String configLocationString) {
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader((BeanDefinitionRegistry) beanFactory);
        beanDefinitionReader.setResourceLoader(applicationContext);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(applicationContext));
        try {
            String[] configLocations = new String[]{configLocationString};
            for (int i = 0; i < configLocations.length; i++)
                beanDefinitionReader.loadBeanDefinitions(applicationContext.getResources(configLocations[i]));
        } catch (BeansException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class GenericBeanConfig {
    private String beanName;

    private Class<?> beanClass;

    private String initMethod;

    private Map<String, String> propertyMap;

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public Class<?> getBeanClass() {
        return beanClass;
    }

    public void setBeanClass(Class<?> beanClass) {
        this.beanClass = beanClass;
    }

    public String getInitMethod() {
        return initMethod;
    }

    public void setInitMethod(String initMethod) {
        this.initMethod = initMethod;
    }

    public Map<String, String> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, String> propertyMap) {
        this.propertyMap = propertyMap;
    }
}


你可能感兴趣的:(Spring动态注册bean到容器)