环境:springboot2.2.6RELEASE实现目标:一写多读,多读可以任意配置,默认是从写库操作,只有满足的方法条件(指定目标方法或标有指定注解的方法将从读库中操作)。独立打包成jar包放在本地仓库。实现原理:通过aop。1.pom.xml配置文件org.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-data-jpaorg.springframework.bootspring-boot-configuration-processortrue2.application.yml配置文件pack:datasource:pointcut:execution(public*net.greatsoft.service.base.*.*(..))||execution(public*net.greatsoft.service.xxx.*.*(..))master:driverClassName:oracle.jdbc.driver.OracleDriverjdbcUrl:jdbc:oracle:thin:@10.100.102.113:1521/orclusername:testpassword:testminimumIdle:10maximumPoolSize:200autoCommit:trueidleTimeout:30000poolName:MbookHikariCPmaxLifetime:1800000connectionTimeout:30000connectionTestQuery:SELECT1FROMDUALslaves:-driverClassName:oracle.jdbc.driver.OracleDriverjdbcUrl:jdbc:oracle:thin:@10.100.102.113:1521/orclusername:dcpassword:dcminimumIdle:10maximumPoolSize:200autoCommit:trueidleTimeout:30000poolName:MbookHikariCPmaxLifetime:1800000connectionTimeout:30000connectionTestQuery:SELECT1FROMDUAL-driverClassName:oracle.jdbc.driver.OracleDriverjdbcUrl:jdbc:oracle:thin:@10.100.102.113:1521/orclusername:empipassword:empiminimumIdle:10maximumPoolSize:200autoCommit:trueidleTimeout:30000poolName:MbookHikariCPmaxLifetime:1800000connectionTimeout:30000connectionTestQuery:SELECT1FROMDUALpointcut:定义切点,那些方法是需要拦截(从读库操作)master:写库配置。slaves:读库配置(Listcollection)。3.属性配置类@Component@ConfigurationProperties(prefix="pack.datasource")publicclassRWDataSourceProperties{privateStringpointcut;privateHikariConfigmaster;privateListslaves=newArrayList<>();}4.读取配置类publicclassRWConfig{privatestaticLoggerlogger=LoggerFactory.getLogger(RWConfig.class);@BeanpublicHikariDataSourcemasterDataSource(RWDataSourcePropertiesrwDataSourceProperties){returnnewHikariDataSource(rwDataSourceProperties.getMaster());}@BeanpublicListslaveDataSources(RWDataSourcePropertiesrwDataSourceProperties){Listlists=newArrayList<>();for(HikariConfigconfig:rwDataSourceProperties)getSlaves()){lists.add(newHikariDataSource(config));}returnlists;}@Bean@Primary@DependsOn({"masterDataSource","slaveDataSources"})publicAbstractRoutingDataSourcoutingDataSource(@Qualifier("masterDataSource")DataSourcemasterDataSource,@Qualifier(“奴隶DataSources")ListslaveDataSources){BaseRoutingDataSourceds=newBaseRoutingDataSource();Map