这里是 springboot多数据源使用@Qualifier自动注入无效的解决
的完整攻略,按照以下步骤进行操作即可。
问题描述
在 Spring Boot 中使用多数据源时,我们通常会在每个数据源的配置类上使用 @Qualifier
注解来标识不同的数据源,以便在注入时进行区分。但是在有些情况下,这种方式可能会导致注入失败,无法自动注入需要的数据源对象。
解决方案
要解决这个问题,我们需要将 @Qualifier
注解替换为 @Resource
注解,同时将数据源对象的名称改为与注解上的名称相匹配。下面是具体的步骤:
- 在需要注入数据源的类中使用
@Resource
注解,例如:
@Resource(name = "primaryDataSource")
private DataSource dataSource;
- 在每个数据源的配置类中,将
@Qualifier
注解替换为@Bean
注解,并指定名称,例如:
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
-
对于需要多个数据源的情况,只需要添加多个
@Bean
方法即可,每个@Bean
方法使用不同的名称。 -
最后,在使用数据源的地方进行调用即可。
示例代码
下面是两个比较简单的示例代码,分别演示了单个数据源和多个数据源的情况。
单个数据源
@Configuration
public class DatabaseConfig {
@Bean(name = "dataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
}
@RestController
public class ExampleController {
@Resource(name = "dataSource")
private DataSource dataSource;
@GetMapping("/example")
public List<Map<String, Object>> example() throws SQLException {
try (Connection con = dataSource.getConnection()) {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM example_table");
List<Map<String, Object>> resultList = new ArrayList<>();
while (rs.next()) {
Map<String, Object> row = new HashMap<>();
row.put("id", rs.getInt("id"));
row.put("name", rs.getString("name"));
resultList.add(row);
}
return resultList;
}
}
}
多个数据源
@Configuration
public class DatabaseConfig {
@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();
}
}
@RestController
public class ExampleController {
@Resource(name = "primaryDataSource")
private DataSource primaryDataSource;
@Resource(name = "secondaryDataSource")
private DataSource secondaryDataSource;
@GetMapping("/example")
public List<Map<String, Object>> example() throws SQLException {
// 使用 primaryDataSource 查询数据
try (Connection con = primaryDataSource.getConnection()) {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM example_table");
List<Map<String, Object>> resultList = new ArrayList<>();
while (rs.next()) {
Map<String, Object> row = new HashMap<>();
row.put("id", rs.getInt("id"));
row.put("name", rs.getString("name"));
resultList.add(row);
}
return resultList;
}
}
@GetMapping("/example2")
public List<Map<String, Object>> example2() throws SQLException {
// 使用 secondaryDataSource 查询数据
try (Connection con = secondaryDataSource.getConnection()) {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM example_table2");
List<Map<String, Object>> resultList = new ArrayList<>();
while (rs.next()) {
Map<String, Object> row = new HashMap<>();
row.put("id", rs.getInt("id"));
row.put("name", rs.getString("name"));
resultList.add(row);
}
return resultList;
}
}
}
以上就是解决 springboot多数据源使用@Qualifier自动注入无效的问题
的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot多数据源使用@Qualifier自动注入无效的解决 - Python技术站