Spring動態註冊bean到容器

直接上代碼:
java

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;
    }
}
相關文章
相關標籤/搜索