springboot多数据源代码
时间: 2023-11-05 11:00:52 浏览: 44
以下是一个简单的Spring Boot多数据源配置示例:
配置文件 application.properties:
```properties
# 数据源1配置
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=user1
spring.datasource.password=password1
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 数据源2配置
spring.datasource.ds2.url=jdbc:mysql://localhost:3306/db2
spring.datasource.ds2.username=user2
spring.datasource.ds2.password=password2
spring.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
```
DataSourceConfig.java:
```java
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "ds2")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
}
```
DataSourceContextHolder.java:
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
```
DataSourceAspect.java:
```java
@Aspect
@Component
public class DataSourceAspect {
@Pointcut("@within(com.example.multidatasourcedemo.annotation.DataSource) || @annotation(com.example.multidatasourcedemo.annotation.DataSource)")
public void pointCut() {}
@Before("pointCut() && @annotation(dataSource)")
public void beforeSwitchDataSource(DataSource dataSource) {
String dataSourceName = dataSource.value();
DataSourceContextHolder.setDataSource(dataSourceName);
}
@After("pointCut()")
public void afterSwitchDataSource() {
DataSourceContextHolder.clearDataSource();
}
}
```
注解 DataSource.java:
```java
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
String value() default "dataSource";
}
```
使用示例:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
@DataSource("ds2")
public List<User> getUsersFromDs2() {
return userDao.getAllUsers();
}
@Override
public List<User> getUsers() {
return userDao.getAllUsers();
}
}
```
在需要切换数据源的方法或类上使用 @DataSource 注解即可。需要注意的是,使用 @DataSource 注解的方法必须是 public 方法,因为 AOP 代理需要访问这些方法。