关于ThreadLocal的实际应用

此处不讲原理,只讲在项目当中实际的应用:

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 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> 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 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;
    }
}
这样就实现了整个的一个切换的过程

你可能感兴趣的:(关于ThreadLocal的实际应用)