| New file | 
 |  |  | 
 |  |  | package com.dy.common.multiDataSource; | 
 |  |  |  | 
 |  |  | import com.alibaba.druid.pool.DruidDataSource; | 
 |  |  | import com.alibaba.druid.pool.DruidDataSourceFactory; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.MutablePropertyValues; | 
 |  |  | import org.springframework.beans.factory.support.BeanDefinitionRegistry; | 
 |  |  | import org.springframework.beans.factory.support.GenericBeanDefinition; | 
 |  |  | import org.springframework.context.EnvironmentAware; | 
 |  |  | import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; | 
 |  |  | import org.springframework.core.env.Environment; | 
 |  |  | import org.springframework.core.env.MapPropertySource; | 
 |  |  | import org.springframework.core.env.StandardEnvironment; | 
 |  |  | import org.springframework.core.type.AnnotationMetadata; | 
 |  |  |  | 
 |  |  | import javax.sql.DataSource; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.Map; | 
 |  |  | import java.util.Properties; | 
 |  |  | import java.util.Set; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * SpringBoot容器启动时,针对数据源,第一步启动本类: | 
 |  |  |  * 收集多数据源的配置,形成各数据源的定义, | 
 |  |  |  * 把数据源的定义作为“dataSource”注册到Spring容器中 | 
 |  |  |  */ | 
 |  |  | @Slf4j | 
 |  |  | public class MultiDataSourceBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar,  EnvironmentAware { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 默认dataSource | 
 |  |  |      */ | 
 |  |  |     private DataSource defaultDataSource; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 数据源map | 
 |  |  |      */ | 
 |  |  |     private Map<String, DataSource> dataSourcesMap = new HashMap<>(); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void setEnvironment(Environment environment) { | 
 |  |  |         //读取配置文件获取更多数据源 | 
 |  |  |         String dsNames = environment.getProperty("spring.datasource.names"); | 
 |  |  |         for (String dsName : dsNames.split(",")) { | 
 |  |  |             dsName = dsName.trim() ; | 
 |  |  |             try{ | 
 |  |  |                 final String keyNames = "spring.datasource." + dsName ; | 
 |  |  |                 Properties properties = new Properties() ; | 
 |  |  |                 ((StandardEnvironment) environment) | 
 |  |  |                         .getPropertySources().stream() | 
 |  |  |                         .forEach((propertySource) -> { | 
 |  |  |                             if (propertySource instanceof MapPropertySource) { | 
 |  |  |                                 MapPropertySource mps = (MapPropertySource) propertySource; | 
 |  |  |                                 Set<String> keys = mps.getSource().keySet(); | 
 |  |  |                                 for (String key : keys) { | 
 |  |  |                                     if (key.startsWith(keyNames)) { | 
 |  |  |                                         properties.put(key.replace(keyNames + ".", ""), String.valueOf(mps.getProperty(key))) ; | 
 |  |  |                                         //log.info(key.replace(keyNames + ".", "") + "=" + String.valueOf(mps.getProperty(key))); | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |  | 
 |  |  |                 DruidDataSource dataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties) ; | 
 |  |  |                 if (dataSourcesMap.size() == 0) { | 
 |  |  |                     defaultDataSource = dataSource; | 
 |  |  |                 } | 
 |  |  |                 dataSourcesMap.put(dsName, dataSource); | 
 |  |  |             }catch (Exception e){ | 
 |  |  |                 log.error("创建数据源" + dsName + "异常", e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { | 
 |  |  |         Map<Object, Object> targetDataSources = new HashMap<Object, Object>(); | 
 |  |  |         //添加其他数据源 | 
 |  |  |         targetDataSources.putAll(dataSourcesMap); | 
 |  |  |         //创建DynamicDataSource | 
 |  |  |         GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); | 
 |  |  |         beanDefinition.setBeanClass(MultiDataSource.class); | 
 |  |  |         beanDefinition.setSynthetic(true); | 
 |  |  |         MutablePropertyValues mpv = beanDefinition.getPropertyValues(); | 
 |  |  |         //defaultTargetDataSource 和 targetDataSources属性是 AbstractRoutingDataSource的两个属性Map | 
 |  |  |         mpv.addPropertyValue("defaultTargetDataSource", defaultDataSource); | 
 |  |  |         mpv.addPropertyValue("targetDataSources", targetDataSources); | 
 |  |  |         //注册到Spring容器中 | 
 |  |  |         registry.registerBeanDefinition("dataSource", beanDefinition); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |