DynamicDataSourceAutoConfiguration.java 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package com.kxs.common.datasource;
  2. import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
  3. import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
  4. import com.baomidou.dynamic.datasource.creator.hikaricp.HikariDataSourceCreator;
  5. import com.baomidou.dynamic.datasource.processor.DsJakartaHeaderProcessor;
  6. import com.baomidou.dynamic.datasource.processor.DsJakartaSessionProcessor;
  7. import com.baomidou.dynamic.datasource.processor.DsProcessor;
  8. import com.baomidou.dynamic.datasource.processor.DsSpelExpressionProcessor;
  9. import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
  10. import com.kxs.common.datasource.config.ClearTtlDataSourceFilter;
  11. import com.kxs.common.datasource.config.DataSourceProperties;
  12. import com.kxs.common.datasource.config.JdbcDynamicDataSourceProvider;
  13. import com.kxs.common.datasource.config.LastParamDsProcessor;
  14. import org.jasypt.encryption.StringEncryptor;
  15. import org.springframework.beans.factory.BeanFactory;
  16. import org.springframework.boot.autoconfigure.AutoConfigureAfter;
  17. import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  18. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  19. import org.springframework.context.annotation.Bean;
  20. import org.springframework.context.annotation.Configuration;
  21. import org.springframework.context.expression.BeanFactoryResolver;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. /**
  25. * @author LXQ
  26. * @date 2021-02-06
  27. * <p>
  28. * 动态数据源切换配置
  29. */
  30. @Configuration(proxyBeanMethods = false)
  31. @AutoConfigureAfter(DataSourceAutoConfiguration.class)
  32. @EnableConfigurationProperties(DataSourceProperties.class)
  33. public class DynamicDataSourceAutoConfiguration {
  34. /**
  35. * 动态数据源提供者
  36. * @param defaultDataSourceCreator 默认数据源创建器
  37. * @param stringEncryptor 字符串加密器
  38. * @param properties 数据源配置属性
  39. * @return 动态数据源提供者
  40. */
  41. @Bean
  42. public DynamicDataSourceProvider dynamicDataSourceProvider(DefaultDataSourceCreator defaultDataSourceCreator,
  43. StringEncryptor stringEncryptor, DataSourceProperties properties) {
  44. return new JdbcDynamicDataSourceProvider(defaultDataSourceCreator, stringEncryptor, properties);
  45. }
  46. /**
  47. * 获取数据源处理器
  48. * @return 数据源处理器
  49. */
  50. @Bean
  51. public DsProcessor dsProcessor(BeanFactory beanFactory) {
  52. DsProcessor lastParamDsProcessor = new LastParamDsProcessor();
  53. DsProcessor headerProcessor = new DsJakartaHeaderProcessor();
  54. DsProcessor sessionProcessor = new DsJakartaSessionProcessor();
  55. DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor();
  56. spelExpressionProcessor.setBeanResolver(new BeanFactoryResolver(beanFactory));
  57. lastParamDsProcessor.setNextProcessor(headerProcessor);
  58. headerProcessor.setNextProcessor(sessionProcessor);
  59. sessionProcessor.setNextProcessor(spelExpressionProcessor);
  60. return lastParamDsProcessor;
  61. }
  62. /**
  63. * 默认数据源创建器
  64. * @param hikariDataSourceCreator Hikari数据源创建器
  65. * @return 默认数据源创建器
  66. */
  67. @Bean
  68. public DefaultDataSourceCreator defaultDataSourceCreator(HikariDataSourceCreator hikariDataSourceCreator) {
  69. DefaultDataSourceCreator defaultDataSourceCreator = new DefaultDataSourceCreator();
  70. List<DataSourceCreator> creators = new ArrayList<>();
  71. creators.add(hikariDataSourceCreator);
  72. defaultDataSourceCreator.setCreators(creators);
  73. return defaultDataSourceCreator;
  74. }
  75. /**
  76. * 清除Ttl数据源过滤器
  77. * @return 清除Ttl数据源过滤器
  78. */
  79. @Bean
  80. public ClearTtlDataSourceFilter clearTtlDsFilter() {
  81. return new ClearTtlDataSourceFilter();
  82. }
  83. }