SpringBoot利用自定义注解实现多数据源

  1. 搭建多数据源环境

首先,我们需要在pom.xml中引入所需依赖:

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

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>

接着,在application.properties中配置两个数据源的连接信息:

# 第一个数据源
first.datasource.url=jdbc:mysql://localhost:3306/first?useUnicode=true&characterEncoding=utf8&useSSL=false
first.datasource.username=root
first.datasource.password=123456
first.datasource.driver-class-name=com.mysql.jdbc.Driver

# 第二个数据源
second.datasource.url=jdbc:mysql://localhost:3306/second?useUnicode=true&characterEncoding=utf8&useSSL=false
second.datasource.username=root
second.datasource.password=123456
second.datasource.driver-class-name=com.mysql.jdbc.Driver

在各自配置的基础上,我们需要通过@ConfigurationProperties注解将两个数据源配置到不同的DataSource实例中,并且注入到Spring容器中:

@Configuration
public class DataSourceConfig {

    @Bean(name = "firstDataSource")
    @Qualifier("firstDataSource")
    @ConfigurationProperties(prefix = "first.datasource")
    public DataSource firstDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "secondDataSource")
    @Qualifier("secondDataSource")
    @Primary
    @ConfigurationProperties(prefix = "second.datasource")
    public DataSource secondDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "dynamicDataSource")
    public DynamicDataSource dataSource(@Qualifier("firstDataSource") DataSource firstDataSource,
                                         @Qualifier("secondDataSource") DataSource secondDataSource) {
        Map<Object, Object> targetDataSource = new HashMap<>();
        targetDataSource.put(DataSourceType.FIRST, firstDataSource);
        targetDataSource.put(DataSourceType.SECOND, secondDataSource);
        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSource);
        dataSource.setDefaultTargetDataSource(firstDataSource);
        return dataSource;
    }

    @Bean(name = "jdbcTemplate")
    public JdbcTemplate jdbcTemplate(
            @Qualifier("dynamicDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}
  1. 添加自定义注解

我们自己定义了一个注解@DataSource,用于注解到数据访问层的接口上:

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

    DataSourceType value() default DataSourceType.FIRST;
}

@DataSource中的DataSourceType是枚举类型,用于标识不同的数据源:

public enum DataSourceType {
    FIRST,
    SECOND
}
  1. AOP切面

最后,在AOP切面中,获取@DataSource注解的值,从而动态切换数据源:

@Component
@Aspect
public class DataSourceAspect {

    @Pointcut("@annotation(com.example.demo.annotation.DataSource) " +
            "|| @within(com.example.demo.annotation.DataSource)")
    public void pointCut() {
    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Class<?> targetClass = joinPoint.getTarget().getClass();

        // 先优先判断类上是否有@DataSource注解
        DataSourceType dsType = targetClass.isAnnotationPresent(DataSource.class) ?
                targetClass.getAnnotation(DataSource.class).value() : DataSourceType.FIRST;

        // 再判断方法上是否有@DataSource注解
        Method method = signature.getMethod();
        if (method.isAnnotationPresent(DataSource.class)) {
            DataSource annotation = method.getAnnotation(DataSource.class);
            dsType = annotation.value();
        }

        DataSourceContextHolder.setDataSourceType(dsType);
        try {
            return joinPoint.proceed();
        } finally {
            DataSourceContextHolder.clearDataSourceType();
        }
    }
}
  1. 示例

示例1:在service层的方法上添加自定义注解@DataSource,并指定使用第二个数据源。即:

@DataSource(DataSourceType.SECOND)
public int updateSecond() {
    // ...
}

示例2:在数据访问层接口上添加自定义注解@DataSource,并指定使用第一个数据源。即:

@DataSource(DataSourceType.FIRST)
public interface FirstMapper {
    // ...
}

以上就是SpringBoot利用自定义注解实现多数据源的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot利用自定义注解实现多数据源 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 浅谈JAVA字符串匹配算法indexOf函数的实现方法

    浅谈JAVA字符串匹配算法indexOf函数的实现方法 介绍 indexOf 是 JAVA 提供的一个用于字符串匹配的函数,它的作用是在一个给定的字符串中寻找另一个子字符串第一次出现的位置。在 JAVA 中,由于字符串是不可变的,所以 indexOf 是该语言中一个十分常用的方法。 indexOf的实现方法 在 JAVA 中,String 类有一个 inde…

    Java 2023年5月19日
    00
  • Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?(推荐)

    Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验? 什么是分布式系统? 在计算机领域,分布式系统(Distributed System)是由多个相互连接、通过共享资源、进行协调工作的计算机组成的系统。它们通过网络互相通信和协调,以执行各种任务。分布式系统有许多优点,比如高可用性、性能扩展、容错性和灵活性等。 什么是分布式系统开发? 分布式系统开发是…

    Java 2023年5月30日
    00
  • 详解Java关于时间格式化的方法

    关于Java中的时间格式化,一般使用SimpleDateFormat类实现。下面我将详细讲解如何使用SimpleDateFormat类对时间进行格式化,并且还会提供两个示例。 一、SimpleDateFormat类的基本用法 SimpleDateFormat类可以把日期时间格式化成需要的字符串形式。具体用法为先创建一个SimpleDateFormat对象,然…

    Java 2023年5月20日
    00
  • JavaEE微框架Spring Boot深入解读

    JavaEE微框架SpringBoot深入解读 简介 Spring Boot是一个基于Spring框架的快速应用开发框架,它简化了Spring应用的开发过程,使用起来非常方便,而且能够快速地搭建一个可用的、生产级别的应用程序。 Spring Boot的核心特性 自动配置 在Spring Boot的自动配置下,开发者不需要再手动地为每一个框架、类库引入一个配置…

    Java 2023年5月15日
    00
  • Spring boot整合shiro+jwt实现前后端分离

    下面是“Spring Boot整合Shiro+JWT实现前后端分离”的完整攻略,包含以下步骤: 1. 添加依赖 首先要在项目的pom.xml文件中添加相关依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring…

    Java 2023年5月20日
    00
  • OpenCms 带分页的新闻列表

    OpenCms 带分页的新闻列表攻略 介绍 OpenCms 是一款基于 Java 开发的内容管理系统,适用于企业网站、入口门户、在线商店、电子杂志、社区等多种应用场景。在 OpenCms 中,我们可以非常方便地实现带分页的新闻列表,方便用户对海量新闻进行分类浏览和查询。 实现步骤 第一步:创建模板文件 在 OpenCms 中,我们需要创建一个模板文件来定义新…

    Java 2023年6月15日
    00
  • Spring security权限配置与使用大全

    Spring Security权限配置与使用大全 简介 Spring Security 是 Spring Framework 提供的安全验证框架,主要解决 Web 应用程序的安全管理问题。它通过认证和授权的方式控制用户对资源的访问权限,防止未授权的用户访问这些资源,保证Web应用程序的安全性。 Spring Security 模块的工作方式是基于过滤器链(F…

    Java 2023年6月3日
    00
  • SpringBoot深入理解之内置web容器及配置的总结

    Spring Boot深入理解之内置Web容器及配置的总结 什么是Spring Boot内置Web容器 Spring Boot是一种轻量级Java开发框架,它简化了Spring应用程序的构建和部署过程。它支持内置Web容器,如Tomcat、Jetty和Undertow。这意味着您可以直接使用可执行Jar文件启动Spring应用程序而无需外部Web服务器。 S…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部