最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot利用自定義注解實現(xiàn)多數(shù)據(jù)源

 更新時間:2022年10月13日 08:33:25   作者:look-word  
這篇文章主要為大家詳細介紹了SpringBoot如何利用自定義注解實現(xiàn)多數(shù)據(jù)源效果,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下

前置學(xué)習(xí)

需要了解 注解、Aop、SpringBoot整合Mybatis的使用。

數(shù)據(jù)準備

基礎(chǔ)項目代碼:https://gitee.com/J_look/spring-boot-all-demo

數(shù)據(jù)庫SQL 項目中有提供,修改基本信息即可

行動起來

添加依賴

利用 AOP 可以實現(xiàn)對某些代碼的解耦,不需要硬編碼編寫。

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

開啟AOP支持

也可以像圖中一樣,也開啟事務(wù)管理器,下文會演示事務(wù)失效的問題。

定義枚舉

這里定義的枚舉,代表我們不同的數(shù)據(jù)庫。

public enum DataSourceType {
    MYSQL_DATASOURCE1,
    MYSQL_DATASOURCE2,
}

定義數(shù)據(jù)源管理器

由于本人實力原因,解答不了大家這里的疑惑。大致功能 通過修改本地線程的值,來實現(xiàn)數(shù)據(jù)源的切換。

@Component
@Primary
public class DataSourceManagement extends AbstractRoutingDataSource {

    public static ThreadLocal<String> flag = new ThreadLocal<>();

    /**
     * 注入數(shù)據(jù)源
     */
    @Resource
    private DataSource mysqlDataSource1;
    /**
     * 注入數(shù)據(jù)源
     */
    @Resource
    private DataSource mysqlDataSource2;

    public DataSourceManagement() {
        flag.set(DataSourceType.MYSQL_DATASOURCE1.name());
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return flag.get();
    }

    @Override
    public void afterPropertiesSet() {
        Map<Object, Object> targetDataSource = new ConcurrentHashMap<>();
        targetDataSource.put(DataSourceType.MYSQL_DATASOURCE1.name(), mysqlDataSource1);
        targetDataSource.put(DataSourceType.MYSQL_DATASOURCE2.name(), mysqlDataSource2);
        // 設(shè)置數(shù)據(jù)源來源
        super.setTargetDataSources(targetDataSource);
        // 設(shè)置默認數(shù)據(jù)源
        super.setDefaultTargetDataSource(mysqlDataSource1);
        super.afterPropertiesSet();
    }
}

自定義注解

@target:表示自定義注解能用在哪里

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TargetDataSource {
    DataSourceType value() default DataSourceType.MYSQL_DATASOURCE1;
}

定義切面類

可以看到,我們的切面類采用的是環(huán)繞通知,博主在寫這篇文章之前,做過大量測試,也參考過比較多的文章,總結(jié)以下幾點:

  • 采用前置通知,雖然能實現(xiàn)數(shù)據(jù)源的切換,但是會導(dǎo)致事務(wù)失效。(推薦視頻)
  • 采用環(huán)繞通知,事務(wù)不會失效,但是切換數(shù)據(jù)源卻實現(xiàn)不了。(由Bean的加載順序?qū)е碌?,下文中的@Order就可以解決,@Transactional默認級別是最后加載??梢圆榭慈罩拘畔⒅獣浴?
@Component
@Aspect
@Slf4j
@Order(Ordered.LOWEST_PRECEDENCE-1) // Bean加載順序
public class TargetDataSourceAspect {

    @Around("@within(TargetDataSource) || @annotation(TargetDataSource)")
    public Object beforeNoticeUpdateDataSource(ProceedingJoinPoint joinPoint) {
        TargetDataSource annotation = null;
        Class<? extends Object> target = joinPoint.getTarget().getClass();
        if (target.isAnnotationPresent(TargetDataSource.class)) {
            // 判斷類上是否標注著注解
            annotation = target.getAnnotation(TargetDataSource.class);
            log.info("類上標注了注解");
        } else {
            Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
            if (method.isAnnotationPresent(TargetDataSource.class)) {
                // 判斷方法上是否標注著注解,如果類和方法上都沒有標注,則報錯
                annotation = method.getAnnotation(TargetDataSource.class);
                log.info("方法上標注了注解");
            } else {
                throw new RuntimeException("@TargetDataSource注解只能用于類或者方法上, 錯誤出現(xiàn)在:[" +
                        target.toString() + " " + method.toString() + "];");
            }
        }
        // 切換數(shù)據(jù)源
        DataSourceManagement.flag.set(annotation.value().name());
        Object result = null;
        try {
            // 執(zhí)行目標代碼
            result = joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return result;
    }
}

Service

啟動測試類:

import look.word.datasource.service.BookService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * @author : look-word
 * 2022-10-10 23:11
 **/
@SpringBootTest
public class TestBookMapper {
    @Resource
    private BookService bookService;
    @Test
    void updatePrice() {
        System.out.println(bookService.updatePrice(1, 777));
    }
}

觀察執(zhí)行日志可知,數(shù)據(jù)源的切換實現(xiàn)了,事務(wù)也沒有失效。

到此這篇關(guān)于SpringBoot利用自定義注解實現(xiàn)多數(shù)據(jù)源的文章就介紹到這了,更多相關(guān)SpringBoot多數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用fastjson中的JSONPath處理json數(shù)據(jù)的方法

    使用fastjson中的JSONPath處理json數(shù)據(jù)的方法

    這篇文章主要介紹了使用fastjson中的JSONPath處理json數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解Java中的do...while循環(huán)語句的使用方法

    詳解Java中的do...while循環(huán)語句的使用方法

    這篇文章主要介紹了Java中的do...while循環(huán)語句的使用方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • maven?helper?jar包沖突的幾種解決方法

    maven?helper?jar包沖突的幾種解決方法

    maven Helper是排查jar包沖突的一大利器,jar包沖突大部分是由于引用了同一個jar的不同版本而導(dǎo)致的,本文主要介紹了maven?helper?jar包沖突的幾種解決方法,感興趣的可以了解一下
    2024-03-03
  • Spring配置數(shù)據(jù)源流程與作用詳解

    Spring配置數(shù)據(jù)源流程與作用詳解

    這篇文章主要介紹了使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗分享,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Java根據(jù)ip地址獲取歸屬地實例詳解

    Java根據(jù)ip地址獲取歸屬地實例詳解

    這篇文章主要為大家介紹了Java根據(jù)ip地址獲取歸屬地實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 使用Java編寫串口程序的流程步驟

    使用Java編寫串口程序的流程步驟

    本文將介紹如何使用Java編寫串口程序,包括串口的基本概念、Java串口通信API的使用、串口程序的開發(fā)流程以及一些常見問題的解決方法等,希望通過本文的介紹,讀者能夠?qū)κ褂肑ava編寫串口程序有一個基本的了解,并能夠?qū)嵺`和應(yīng)用于實際項目中
    2023-11-11
  • Java 導(dǎo)出excel進行換行的案例

    Java 導(dǎo)出excel進行換行的案例

    這篇文章主要介紹了Java 導(dǎo)出excel進行換行的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot整合liquibase的實現(xiàn)方法

    SpringBoot整合liquibase的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot整合liquibase的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java使用Graphics2D繪圖/畫圖方式

    java使用Graphics2D繪圖/畫圖方式

    這篇文章主要介紹了java使用Graphics2D繪圖/畫圖方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java內(nèi)存緩存工具Guava LoadingCache使用解析

    Java內(nèi)存緩存工具Guava LoadingCache使用解析

    這篇文章主要介紹了Java內(nèi)存緩存工具Guava LoadingCache使用解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

天全县| 舟曲县| 中方县| 龙州县| 涟水县| 晋宁县| 锡林浩特市| 介休市| 军事| 抚远县| 广汉市| 巩留县| 尤溪县| 重庆市| SHOW| 汝城县| 鄂托克前旗| 囊谦县| 永济市| 成安县| 合作市| 太和县| 阳原县| 合阳县| 蕉岭县| 铁岭县| 红河县| 普陀区| 容城县| 永川市| 黄骅市| 兴城市| 正安县| 黔江区| 海口市| 乳源| 高唐县| 麻栗坡县| 宜昌市| 天津市| 中西区|