当前位置: 首页> 汽车> 时评 > 公司和企业的区别_建设工程项目的组成_网店如何营销推广_高端大气网站建设

公司和企业的区别_建设工程项目的组成_网店如何营销推广_高端大气网站建设

时间:2025/7/11 18:03:03来源:https://blog.csdn.net/qq_42631788/article/details/142418559 浏览次数: 0次
公司和企业的区别_建设工程项目的组成_网店如何营销推广_高端大气网站建设

文章目录

      • 1. 添加依赖
      • 2. 配置数据源
      • 3. 创建 `DynamicDataSource` 类
      • 4. 创建 `DynamicDataSourceContextHolder`
      • 5. 配置数据源切换 AOP
      • 6. 自定义注解 `@DataSource`
      • 7. 使用示例
      • 8. 配置文件 `application.yml`
      • 9. 总结

在 Spring Boot 中,动态数据源的配置和使用可以通过 AbstractRoutingDataSource 类实现,它允许在运行时动态切换数据源。以下是一个简单的配置和使用示例。

1. 添加依赖

首先在 pom.xml 文件中添加相关的数据库和 MyBatis 依赖:

<dependencies><!-- Spring Boot Starter for Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- HikariCP 数据源 --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- MyBatis 支持 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency>
</dependencies>

含义

  • spring-boot-starter-data-jpa: 提供 Spring Data JPA 的支持,方便处理数据库操作。
  • mysql-connector-java: MySQL 驱动,用于连接 MySQL 数据库。
  • HikariCP: 高性能数据源连接池实现。
  • mybatis-spring-boot-starter: 提供 MyBatis 对 Spring Boot 的支持,方便使用 MyBatis 进行数据库操作。

这些依赖是项目中所需的核心组件,帮助进行数据库连接、操作和数据源管理。


2. 配置数据源

创建一个配置类来定义多个数据源。

@Configuration
public class DataSourceConfig {@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "dynamicDataSource")public DataSource dynamicDataSource(@Qualifier("primaryDataSource") DataSource primaryDataSource,@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("primary", primaryDataSource);targetDataSources.put("secondary", secondaryDataSource);DynamicDataSource dynamicDataSource = new DynamicDataSource();dynamicDataSource.setDefaultTargetDataSource(primaryDataSource);dynamicDataSource.setTargetDataSources(targetDataSources);return dynamicDataSource;}
}

含义

  • @Configuration: 标记该类为配置类,Spring Boot 会自动扫描并处理其中的 @Bean 定义。
  • primaryDataSource()secondaryDataSource(): 定义两个不同的数据源,通过 @ConfigurationPropertiesapplication.yml 中读取配置。
  • dynamicDataSource(): 定义动态数据源,将多个数据源放入 targetDataSources 中,并设置一个默认的数据源(primary)。返回的 DynamicDataSource 实现允许应用程序在运行时切换数据源。

3. 创建 DynamicDataSource

这个类继承自 AbstractRoutingDataSource,用于动态决定使用哪个数据源。

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDataSourceType();}
}

含义

  • DynamicDataSource: 继承 AbstractRoutingDataSource,它负责决定当前使用哪个数据源。AbstractRoutingDataSource 是 Spring 提供的一个类,可以基于业务逻辑动态选择数据源。
  • determineCurrentLookupKey(): 根据当前线程保存的数据库类型,决定要使用的具体数据源。具体的数据库类型是通过 DynamicDataSourceContextHolder 设置和获取的。

4. 创建 DynamicDataSourceContextHolder

创建 DynamicDataSourceContextHolder 用于保存当前线程的数据库类型

public class DynamicDataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}

含义

  • ThreadLocal: 用于在线程内部保存数据库类型。这样每个线程可以独立设置和获取当前使用的数据源类型。
  • setDataSourceType(): 设置当前线程的数据源类型。
  • getDataSourceType(): 获取当前线程的数据源类型。
  • clearDataSourceType(): 清除当前线程的数据源类型。

这个类相当于一个工具类,用来管理和存储当前使用的数据源。


5. 配置数据源切换 AOP

通过 AOP 在服务层方法中动态切换数据源。

@Aspect
@Component
public class DynamicDataSourceAspect {@Before("@annotation(ds)")public void switchDataSource(JoinPoint point, DataSource ds) {DynamicDataSourceContextHolder.setDataSourceType(ds.value());}@After("@annotation(ds)")public void clearDataSource(JoinPoint point, DataSource ds) {DynamicDataSourceContextHolder.clearDataSourceType();}
}

含义

  • @Aspect: 声明该类为一个 AOP 切面,允许在目标方法执行前后执行额外的逻辑。
  • @Before@After: 在带有 @DataSource 注解的方法执行前后切换数据源。
  • switchDataSource(): 在方法执行之前,根据注解值设置当前线程的数据源类型。
  • clearDataSource(): 在方法执行后清除数据源类型,避免影响后续的操作。

6. 自定义注解 @DataSource

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {String value() default "primary";
}

含义

  • @Target: 指定该注解可以用在方法和类上。
  • @Retention: 指定注解的生命周期是运行时,允许反射获取注解信息。
  • @Documented: 使注解成为文档的一部分。
  • @interface DataSource: 自定义注解,用来标识在哪些地方需要切换数据源。

此注解可以用来标记方法或类,指定该方法或类使用哪个数据源。


7. 使用示例

在服务层方法上使用注解切换数据源。

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@DataSource("primary")public List<User> getAllUsersFromPrimary() {return userMapper.getAllUsers();}@DataSource("secondary")public List<User> getAllUsersFromSecondary() {return userMapper.getAllUsers();}
}

含义

  • @DataSource("primary")@DataSource("secondary"): 在不同的方法上使用自定义注解,表示该方法执行时使用不同的数据源。
  • 这样在调用 getAllUsersFromPrimary() 时,程序会使用主数据源,而调用 getAllUsersFromSecondary() 时,会使用从数据源。

8. 配置文件 application.yml

在 application.yml 中配置多个数据源:

spring:datasource:primary:url: jdbc:mysql://localhost:3306/primary_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driversecondary:url: jdbc:mysql://localhost:3306/secondary_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver

含义

  • application.yml 中配置两个不同的数据库连接,一个为主数据库(primary),一个为从数据库(secondary)。这些配置将会被 DataSourceConfig 类中的 @ConfigurationProperties 自动读取,用来初始化对应的数据源。

9. 总结

整个流程使用了 Spring Boot 提供的 AbstractRoutingDataSource 机制,通过动态切换不同的数据源,支持在运行时决定应用程序使用的数据库。每个步骤紧密配合,确保在应用运行时根据不同的业务需求选择合适的数据源。

通过 @DataSource 注解,可以灵活地在服务层方法中进行数据源切换,而不需要手动管理数据库连接逻辑。

关键字:公司和企业的区别_建设工程项目的组成_网店如何营销推广_高端大气网站建设

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: