此处不讲原理,只讲在项目当中实际的应用:
1.本身的产生就是一个全局变量的概念,有好多博客说是全局变量的副本也没错
应用:
1.sesstion的统一管理,也可以说是Token的统一管理
2.数据库中的统一管理.不说了直接上代码
1.token----用户名的获取:
上一篇博客有说明
2.数据库
package com.zwl.dao.config; /** * ${保存一个线程安全的DatabaseType容器} * * @author wb-zjp283121 * create 2018-06-29 13:34 **/ public class DatabaseContextHolder { /** * 用于存放多线程环境下的成员变量 */ private static final ThreadLocal<DatabaseType> CONTEXT_HOLDER = new ThreadLocal<>(); public static void setDatabaseType(DatabaseType type) { CONTEXT_HOLDER.set(type); } public static DatabaseType getDatabaseType() { return CONTEXT_HOLDER.get(); } }
package com.zwl.dao.config; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import org.springframework.lang.Nullable; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * ${创建动态数据源} * 实现数据源切换的功能就是自定义一个类扩展AbstractRoutingDataSource抽象类, * 其实该相当于数据源DataSource的路由中介,可以实现在项目运行时根据相应key值切换到对应的数据源DataSource上 * author * create 2018-06-29 13:35 **/ public class DynamicDataSource extends AbstractRoutingDataSource { public static final Map<DatabaseType, List<String>> METHOD_TYPE_MAP = new HashMap<>(); @Nullable @Override protected Object determineCurrentLookupKey() { DatabaseType type = DatabaseContextHolder.getDatabaseType(); // logger.info("====================dataSource ==========" + type); return type; } void setMethodType(DatabaseType type, String content) { List<String> list = Arrays.asList(content.split(",")); METHOD_TYPE_MAP.put(type, list); } }
package com.zwl.dao.config; /** * ${列出数据源类型} * author * create 2018-06-29 13:34 **/ public enum DatabaseType { master("write"), slave("read"); DatabaseType(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "DatabaseType{" + "name='" + name + '\'' + '}'; } }
package com.zwl.dao.config; import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.context.annotation.Configuration; /** * ${DESCRIPTION} * author * create 2018-06-27 10:44 **/ @Configuration @AutoConfigureAfter(DataSourceConfig.class) @MapperScan("com.zwl.dao.mapper") public class MybatisMapperScannerConfig { public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setBasePackage("com.zwl.dao.mapper"); return mapperScannerConfigurer; } } 这样就实现了整个的一个切换的过程