美文网首页
基于Spring动态创建数据源

基于Spring动态创建数据源

作者: do_young | 来源:发表于2019-01-04 13:42 被阅读16次

获取Spring容器

及要得到Spring的ApplicationContext对象,可以创建一个类实现于org.springframework.context.ApplicationContextAware接口。

public class DataSourceCreator implements ApplicationContextAware {
        private ConfigurableApplicationContext applicationContext = null;
    public ConfigurableApplicationContext getApplicationContext() {
        return applicationContext;
    }
......

通过Spring容器获得对象工厂类DefaultListableBeanFactory

private DefaultListableBeanFactory beanFactory = null;
this.beanFactory = (DefaultListableBeanFactory) this.applicationContext.getAutowireCapableBeanFactory();

创建数据源对象定义

使用org.springframework.beans.factory.support.BeanDefinitionBuilder,创建数据源对象并设置属性,下面以com.alibaba.druid.pool.DruidDataSource数据源为例:

        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(com.alibaba.druid.pool.DruidDataSource.class);
        builder.setInitMethodName("init");
        builder.setDestroyMethodName("close");
        builder.addPropertyValue("driverClassName", datasource.getDriverClass());
        builder.addPropertyValue("url", datasource.getJdbcUrl());
        LogUtils.getSingleton().debug(datasource.getJdbcUrl());
        builder.addPropertyValue("username", datasource.getUser());
        builder.addPropertyValue("password", datasource.getPassword());
        builder.addPropertyValue("initialSize", 1);

注册数据源对象定义

this.beanFactory.registerBeanDefinition(datasource.getDatasourceName(), builder.getBeanDefinition());

完成,以下是完整的代码:

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;

import com.going100.datasource.domain.Datasource;
import com.going100.nifty.common.util.LogUtils;

@Component
public class DataSourceCreator implements ApplicationContextAware {

    private ConfigurableApplicationContext applicationContext = null;

    private DefaultListableBeanFactory beanFactory = null;

    public ConfigurableApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = (ConfigurableApplicationContext) applicationContext;
        this.beanFactory = (DefaultListableBeanFactory) this.applicationContext.getAutowireCapableBeanFactory();
    }

    public void createDruidDataSource(Datasource datasource) {
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(com.alibaba.druid.pool.DruidDataSource.class);
        builder.setInitMethodName("init");
        builder.setDestroyMethodName("close");
        builder.addPropertyValue("driverClassName", datasource.getDriverClass());
        builder.addPropertyValue("url", datasource.getJdbcUrl());
        LogUtils.getSingleton().debug(datasource.getJdbcUrl());
        builder.addPropertyValue("username", datasource.getUser());
        builder.addPropertyValue("password", datasource.getPassword());
        builder.addPropertyValue("initialSize", 1);
        this.beanFactory.registerBeanDefinition(datasource.getDatasourceName(), builder.getBeanDefinition());
    }
}

相关文章

网友评论

      本文标题:基于Spring动态创建数据源

      本文链接:https://www.haomeiwen.com/subject/omjhrqtx.html