@datasource 通过springel表达式切换数据源
时间: 2024-09-24 17:18:35 浏览: 55
`@DataSource` 是Spring框架中的一个注解,它常用于支持应用在运行时动态切换数据库数据源。在Spring Boot中,特别是与JPA或MyBatis等持久层框架结合时,你可以通过Spring Expression Language (SpEL) 表达式来控制何时从哪个数据源获取数据。
例如,当你有多个数据源,比如生产环境和测试环境,你可以配置两个不同的`DataSource`实例,并在需要切换的时候设置一个属性值,然后用SpEL来读取这个属性并根据其值选择正确的数据源。下面是一个简单的例子:
```java
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
private final String dataSourceName;
public DataSourceConfig(String dataSourceName) {
this.dataSourceName = dataSourceName;
}
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource", ignoreInvalidFields = true)
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("schema.sql")
.build();
}
@Bean
@Primary
@Profile("!test")
public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
@Profile("test")
public JdbcTemplate testJdbcTemplate(@Qualifier(dataSourceName) DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
// 使用SpEL表达式来动态选择数据源
@Bean
public PlatformTransactionManager transactionManager() {
return new DelegatingPlatformTransactionManager() {
@Override
protected PlatformTransactionManager delegateTransactionManagement() {
return ExpressionUtils.getExpressionValue(environment, "#{environment['spring.profiles.active'] == 'test'} ? testJdbcTemplate : jdbcTemplate", PlatformTransactionManager.class);
}
};
}
}
```
在这个示例中,`transactionManager`方法内部会根据当前激活的profile(如`spring.profiles.active`),使用SpEL表达式动态决定返回`jdbcTemplate`还是`testJdbcTemplate`。
阅读全文