spring多数据源配置 简单明了

来源地址https://blog.csdn.net/ll535299/article/details/78203634

 

1.首先在config.properties文件中配置两个数据库连接的基本数据。这个省略了 
2.在spring配置文件中配置这两个数据源: 
数据源1

 
    
        
        
        
        
        
        
    

 

数据源2


        
        
        
        
        
        
    

 

3.自定义一个数据源类,该类继承 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 
并重写determineCurrentLookupKey()方法 
3.1代码如下

public class RoutingDataSource extends AbstractRoutingDataSource  {

     @Override
     protected Object determineCurrentLookupKey() {
            return DataSourceHolder.getDataSourceType();
     }

}

 

3.2将该类交由sping管理,其在spring配置文件中配置如下


        
        
            
                
                
            
        
        
         
    

3.3spring其他的配置如下


    
        
        
        
        
        
                
                    classpath:com/coe/exp/core/xml/**/*.xml
                    classpath:com/coe/exp/xml/**/*.xml
            
        
        
        
    


    
        
        
    

    
    
        
    

    
         
             
             
             
             
             
             
             
             
         
     

     
         
         
     

    
    


    
    
      
        
    
      
    
     
    
    
    

4.编写一个数据源持有类DataSourceHolder

public class DataSourceHolder {

    private static final ThreadLocal contextHolder = new ThreadLocal(); 

    /**
     * @Description: 设置数据源类型
     * @param dataSourceType  数据库类型
     * @return void
     * @throws
     */ 
    public static void setDataSourceType(String dataSourceType) { 
        contextHolder.set(dataSourceType); 
    } 

    /**
     * @Description: 获取数据源类型
     * @param 
     * @return String
     * @throws
     */ 
    public static String getDataSourceType() { 
        return contextHolder.get(); 
    } 

    /**
     * @Description: 清除数据源类型
     * @param 
     * @return void
     * @throws
     */ 
    public static void clearDataSourceType() { 
        contextHolder.remove(); 
    }
}

5.自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

/**
 * 数据源
 * 
 * @author llb 2017-03-30
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface DataSource {

    String value() default "";

}

6.动态切换数据源

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Repository;

import com.coe.exp.core.dataSource.DataSourceHolder;


@Order(1)
@Aspect  
@Repository
public class DataSourceAspect {

    @Pointcut("execution(* com..dao..*Impl.*(..))")
    private void anyMethod() {  
    }

    @AfterReturning(value = "anyMethod()", returning = "result")  
    public void afterReturning(JoinPoint joinPoint,Object result){
        DataSourceHolder.clearDataSourceType();
    }

    @Before(value="anyMethod()")
    public void before(JoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();  
        Method method = methodSignature.getMethod();  
        //如果方法体上使用了DataSource注解
        if (method.isAnnotationPresent(DataSource.class)) {
            //获取该方法上的注解名
            DataSource datasource = method.getAnnotation(DataSource.class);
            //将方法体上的注解的值赋予给DataSourceHolder数据源持有类
            DataSourceHolder.setDataSourceType(datasource.value());
        }
    }

}

7.若方法体上没有注解,则都是使用默认数据源,如果有以下注解,则使用指定的数据源

/**
     * 查询哲盟数据库中所有状态正常的客户余额
     * @return
     * @author mxl
     * @version 2017年8月16日下午1:30:06
     */
    @DataSource("ds2")
    public List getAllCustBalanceByZm(){
        return customerBalanceMapper.getAllCustBalanceByZm();
    }

上面这个方法就是使用“ds2”;

你可能感兴趣的:(spring多数据源配置 简单明了)