第八章 springboot + mybatis + 多数据源3(使用切面AOP)

引入 aop包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

1.新建注解 DS

package com.example.abstractroutingdatasource.config;

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

/**

 * 在方法上使用,用于指定使用哪个数据源

 *

 * @version v.0.1

 */

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DS {
    String value();

}

2.新建AOP  DataSourceAspect

package com.example.abstractroutingdatasource.config;

import com.sun.corba.se.impl.orb.DataCollectorBase;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
@Order(-10)//保证该AOP在@Transactional之前执行
@Component
public class DataSourceAspect {

  /*

     * @Before("@annotation(ds)")

     * 的意思是:
     * @Before:在方法执行之前进行执行:

     * @annotation(targetDataSource):

     * 会拦截注解targetDataSource的方法,否则不拦截;

     */

  //  @Before("execution(* com.example.*.dao..*.*(..))")
  @Before("@annotation(ds)")
    public void changeDataSource(JoinPoint point,DS ds) throws Throwable {
        //获取当前的指定的数据源;
        String dsId =ds.value();
        //如果不在我们注入的所有的数据源范围之内,那么输出警告信息,系统自动使用默认的数据源。
        DatabaseContextHolder.setDatabaseType(dsId);

        }

    @After("@annotation(ds)")
    public void restoreDataSource(JoinPoint point, DS ds) {

        System.out.println("Revert DataSource : {} > {}"+ds.value()+point.getSignature());

        //方法执行完毕之后,销毁当前数据源信息,进行垃圾回收。

        DatabaseContextHolder.ClearDataBaseType();

    }

}

3.在dao 上加注解

package com.example.abstractroutingdatasource.dao;

import com.example.abstractroutingdatasource.config.DS;
import com.example.abstractroutingdatasource.config.DatabaseContextHolder;
import com.example.abstractroutingdatasource.entity.UcUser;
import com.example.abstractroutingdatasource.mapper.UcUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.net.UnknownHostException;

@Repository
public class UcUserDao {

    @Autowired
    private UcUserMapper ucUserMapper;

    @DS(value="1")
    public UcUser  selectOne(String id,String ds ){
       // DatabaseContextHolder.setDatabaseType(ds); //手动设置库
         return  ucUserMapper.getUser(id);
    }

    @DS(value="2")
    public UcUser  selectOne2(String id,String ds ){
        // DatabaseContextHolder.setDatabaseType(ds); //手动设置库
        return  ucUserMapper.getUser(id);
    }
}

4.完成,启动应用访问页面 数据源会自动切换

demo 链接: https://pan.baidu.com/s/1rpC7lMxF_ENW_zLr7MGlBQ 

原文地址:https://www.cnblogs.com/tiancai/p/9117096.html

时间: 2024-11-13 07:58:30

第八章 springboot + mybatis + 多数据源3(使用切面AOP)的相关文章

第八章 springboot + mybatis + 多数据源(转载)

本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法 3)DynamicDataSource继承AbstractRoutin

第八章 springboot + mybatis + 多数据源

在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法 3)DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用Da

第九章 springboot + mybatis + 多数据源 (AOP实现)

在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.xxx.firstboot.domain.Shop; import com.xx

SpringBoot Mybatis双数据源的配置

近期因为公司项目的需要,用上了maven和Springboot,对于java开发这块,早闻maven是个好东西,但一直没有去用,感觉用maven帮我们自己做了太多的事情,一个项目跑起来都不知道背后做了些什么,现在想想,可能那个时候脑子进水了吧. Springboot作为Spring的简约版(我是这么叫的,没有任何依据),将原来Spring需要做的配置文件,改为了注解,提供了大量的***start组件来帮我们做了很多初始化的处理. 但是今天我想要分享的不是maven如何搭建一个helloword的

SpringBoot (七) :springboot + mybatis 多数据源最简解决方案

原文出处: 纯洁的微笑 说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解决方案,还有的是利用aop动态切换,感觉有点小复杂,其实我只是想找一个简单的多数据支持而已,折腾了两个小时整理出来,供大家参考. 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.config-locations=classpath:

springboot(七):springboot+mybatis多数据源最简解决方案

说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解决方案,还有的是利用aop动态切换,感觉有点小复杂,其实我只是想找一个简单的多数据支持而已,折腾了两个小时整理出来,供大家参考. 废话不多说直接上代码吧 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.config-locations=classpath:

第九章 springboot + mybatis + 多数据源 (AOP实现)(转载)

本编博客转发自:http://www.cnblogs.com/java-zhao/p/5415896.html 1.ShopDao package com.xxx.firstboot.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import com.xxx.firstboot.domain.Shop; im

springboot+mybatis+Druid配置多数据源(mysql+postgre)

springboot+mybatis+Druid配置多数据源(mysql+postgre)引入pom依赖设置application多数据源config配置db1config配置(主数据库配置)db2config配置(其他数据库)事务处理mapper层 springboot+mybatis+Druid配置多数据源(mysql+postgre) 参考资料: 第八章 springboot + mybatis + 多数据源 springboot + mybatis + druid + 多数据源 spri

第五章 springboot + mybatis(转载)

本编博客转发自:http://www.cnblogs.com/java-zhao/p/5350021.html springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成.集成方式相当简单. 1.项目结构 2.pom.xml 1 <!-- 与数据库操作相关的依赖 --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4