ssm maven spring AOP读写分离

ssm maven spring AOP读写分离

总体流程

配置最开始写在pom.xml文件,解析到数据库配置文件,再解析到spring配置文件。

自定义注解DataSource;通过这个注解并且在spring、springmv配置文件添加AOP拦截,去定义拦截函数,根据参数切换数据源。

即通过注解实现AOP拦截controller,或者service层。从而实现读写分离。

具体见代码和注释。

1,pom.xml 配置数据库部分

            local
            
                
                com.mysql.jdbc.Driver
                XXX
                XXX

                
                
                LTAIz0kIEQRSBc6G
                3YS3fXPvIHng11ft7wQRGDeojP2Neg
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                app-image
                

                LTAItRByuljwgIgI
                fauyIEV8LMwSj8alFYUqEXeU5VMfwY
                3000
                PID-Template-Task
                CID-AppServer
                template-tasks
                template-results
                pic-tasks
                pic-results
                PID-Pic-Task
                server-status
                PID-Manage
                server-config
            
            
                true
            
        
        
            localSalve
            
                
                com.mysql.jdbc.Driver
                XXX
                XXX

                
                
                LTAIz0kIEQRSBc6G
                3YS3fXPvIHng11ft7wQRGDeojP2Neg
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                iceplay
                app-image
                

                LTAItRByuljwgIgI
                fauyIEV8LMwSj8alFYUqEXeU5VMfwY
                3000
                PID-Template-Task
                CID-AppServer
                template-tasks
                template-results
                pic-tasks
                pic-results
                PID-Pic-Task
                server-status
                PID-Manage
                server-config
            
            
                true
            
            
2,数据库配置文件(部分)
config_url:${db-url}
config_driverClassName:${db-driverClassName}
config_username:${db-username}
config_password:${db-password}
       
salve_config_url:${dbs-url}
salve_config_driverClassName:${dbs-driverClassName}
salve_config_username:${dbs-username}
salve_config_password:${dbs-password}
3,spring springmvc配置文件

spring 配置数据连接池,数据源,拦截等。



    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
      
          
              
                  
                  
                  
                  
              

          
          
    
        
    
    
    
        
            
            
        
    
    

spring mvc:加这一句主要是为了使之可以拦截controller


    
    

加上边一句的同时头部要加上下边三句到相应的位置。

xmlns:aop="http://www.springframework.org/schema/aop"  

    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop.xsd

4,java 数据源文件

定义一个名为DataSource的注解,Target用于指定注解可以添加的位置。两个参数的意思是:类和接口、方法。Retention 的作用时指定注解运行时间,运行时。


@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {

    String value();
}

定义AOP切面以便拦截所有带有注解@DataSource的方法,取出注解的值作为数据源标识放到DynamicDataSourceHolder的线程变量中

public class DataSourceAspect {

   public void before(JoinPoint point){
       Object target = point.getTarget();
       String method = point.getSignature().getName();
       System.out.println(method);
       Class classz = target.getClass();
       Class[] parameterTypes = ((MethodSignature) point.getSignature())  
               .getMethod().getParameterTypes();
       
       try {
           Method m = classz.getDeclaredMethod(method, parameterTypes);
           if(m != null && m.isAnnotationPresent(DataSource.class)){
               DataSource ds = m.getAnnotation(DataSource.class);
               DynamicDataSourceHolder.putDataSource(ds.value());
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

Spring 的AbstractRoutingDataSource获取数据源之前会先调用determineCurrentLookupKey方法查找当前的lookupKey,这个lookupKey就是数据源标识。
因此通过重写这个查找数据源标识的方法就可以让spring切换到指定的数据源了。

创建一个DynamicDataSource的类,继承AbstractRoutingDataSource并重写determineCurrentLookupKey方法,

public class DynamicDataSource extends AbstractRoutingDataSource{

    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceHolder.getDataSource();
    }

}

创建DynamicDataSourceHolder用于持有和设置当前线程中使用的数据源标识

public class DynamicDataSourceHolder {
    
    public static final ThreadLocal holder = new ThreadLocal();

    public static void putDataSource(String name){
        holder.set(name);
    }
    
    public static String getDataSource(){
        return holder.get();
    }
}

多数据源切换方法类似,再配置新的数据源,通过注解切换即可。

参考:http://www.cnblogs.com/liujiduo/p/5004691.html
http://blog.csdn.net/u010004317/article/details/47700447
http://blog.csdn.net/mfc2003/article/details/48490151

----名白
转载注明出处:http://www.jianshu.com/p/302e1bb76710

你可能感兴趣的:(ssm maven spring AOP读写分离)