All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.tairanchina.csp.dew.jdbc.DewDSAutoConfiguration Maven / Gradle / Ivy

package com.tairanchina.csp.dew.jdbc;

import com.alibaba.druid.pool.DruidDataSource;
import com.tairanchina.csp.dew.Dew;
import com.tairanchina.csp.dew.core.basic.loading.DewLoadImmediately;
import com.tairanchina.csp.dew.core.jdbc.DSManager;
import com.tairanchina.csp.dew.jdbc.config.DewMultiDSConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


@Configuration
@EnableConfigurationProperties(DewMultiDSConfig.class)
@AutoConfigureAfter(JdbcTemplateAutoConfiguration.class)
@DewLoadImmediately
public class DewDSAutoConfiguration implements DSManager {

    private static final Logger logger = LoggerFactory.getLogger(DewDSAutoConfiguration.class);

    private static final Pattern LINE_TO_CAMEL_REGEX = Pattern.compile("-[a-z]{1}");

    private DewMultiDSConfig dsConfig;

    @Autowired
    private JdbcTemplate primaryJdbcTemplate;

    @Autowired
    private DataSource dataSource;

    private DefaultListableBeanFactory beanFactory;

    @Value("${spring.datasource.url}")
    private String primaryJdbcUrl;

    public DewDSAutoConfiguration(DewMultiDSConfig dsConfig) {
        this.dsConfig = dsConfig;
    }

    @PostConstruct
    private void init() throws SQLException {
        logger.info("Load Auto Configuration : {}", this.getClass().getName());
        // Register TransactionManager
        beanFactory = (DefaultListableBeanFactory) ((ConfigurableApplicationContext) Dew.applicationContext).getBeanFactory();
        AbstractBeanDefinition transactionManager = BeanDefinitionBuilder.rootBeanDefinition(DataSourceTransactionManager.class)
                .addConstructorArgValue(dataSource).getBeanDefinition();
        transactionManager.setScope("singleton");
        transactionManager.setPrimary(true);
        beanFactory.registerBeanDefinition("transactionManager", transactionManager);
        // Register primary DS
        AbstractBeanDefinition dsBean = BeanDefinitionBuilder.rootBeanDefinition(DewDS.class)
                .addPropertyValue("jdbcTemplate", primaryJdbcTemplate)
                .addPropertyValue("jdbcUrl", primaryJdbcUrl)
                .setInitMethodName("init").getBeanDefinition();
        dsBean.setScope("singleton");
        dsBean.setPrimary(true);
        beanFactory.registerBeanDefinition("ds", dsBean);
        // Register others DS
        if (dsConfig.getMultiDatasources() != null && !dsConfig.getMultiDatasources().isEmpty()) {
            for (Map.Entry> entry : dsConfig.getMultiDatasources().entrySet()) {
                String dsName = entry.getKey();
                DruidDataSource ds = new DruidDataSource();
                Properties properties = new Properties();
                entry.getValue().forEach((k, v) -> {
                    Matcher m = LINE_TO_CAMEL_REGEX.matcher(k);
                    while (m.find()) {
                        String str = m.group();
                        k = k.replace(str, str.substring(1).toUpperCase());
                    }
                    switch (k) {
                        case "maxActive":
                            ds.setMaxActive(Integer.valueOf(v));
                            break;
                        case "minIdle":
                            ds.setMinIdle(Integer.valueOf(v));
                            break;
                        case "maxWait":
                            ds.setMaxWait(Integer.valueOf(v));
                            break;
                        default:
                            break;
                    }
                    properties.put("druid." + k, v);
                });
                ds.setConnectProperties(properties);
                register(dsName, entry.getValue().get("url"), ds);
            }
        }
    }

    private void register(String dsName, String jdbcUrl, DataSource dataSource) {
        // Package TransactionManager
        AbstractBeanDefinition transactionManager = BeanDefinitionBuilder.rootBeanDefinition(DataSourceTransactionManager.class)
                .addConstructorArgValue(dataSource).getBeanDefinition();
        transactionManager.setScope("singleton");
        transactionManager.setPrimary(false);
        beanFactory.registerBeanDefinition(dsName + "TransactionManager", transactionManager);
        // Register JdbcTemplate
        AbstractBeanDefinition jdbcTemplate = BeanDefinitionBuilder.rootBeanDefinition(JdbcTemplate.class)
                .addConstructorArgValue(dataSource).getBeanDefinition();
        jdbcTemplate.setScope("singleton");
        jdbcTemplate.setPrimary(false);
        beanFactory.registerBeanDefinition(dsName + "JdbcTemplate", jdbcTemplate);
        // Register DS
        AbstractBeanDefinition dsBean = BeanDefinitionBuilder.rootBeanDefinition(DewDS.class)
                .addPropertyReference("jdbcTemplate", dsName + "JdbcTemplate")
                .addPropertyValue("jdbcUrl", jdbcUrl)
                .setInitMethodName("init").getBeanDefinition();
        dsBean.setScope("singleton");
        dsBean.setPrimary(false);
        beanFactory.registerBeanDefinition(dsName + "DS", dsBean);
    }

}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy