java - 在 Controller 中使用 @Autowired 和 @Qualifier 更改服务的数据源
问题描述
我是使用 Spring Boot 的新手,目前遇到了问题。
我有一个具有 3 层的应用程序,控制器、服务和存储库。TL:DR,在这里找到我的设置图:
那么我该如何进行这项工作呢?能够在控制器类中切换存储库吗?
控制器调用服务,然后使用存储库中的类返回正确的数据(在需要时执行逻辑魔术之后)。我还使用 Hibernate 和 H2 inmemory 使 SQL 连接更容易,但是出于测试目的,我希望在另一个存储库类中硬编码数据和方法。我的控制器通过服务使用 H2 inmem 数据源,而我的测试类使用硬编码数据源。
使用简单的依赖注入,我可以将所需的存储库类添加到服务类构造函数中,并且取决于使用测试类或控制器类,这可以正常工作。
但是,我想使用@Autowired
注释,并发现您可以@Qualifier
在服务类中使用来在自动装配的 repo 类之间切换。但是,我不想在服务类中执行此操作(在那里对其进行硬编码),而是动态执行此操作,并让控制器或测试类注入数据源选择。
这甚至可能吗,我该怎么做?
解决方案
您的包结构应如下所示:
- 实体
- 存储库
- 服务和服务工具
- 控制器
实体示例:
@Entity
@Table(name = "table_name")
public class NameEntiy implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@Column(name = "name_column_in_your_database")
private String data;
// constructors, getter, setter, hascode, equals and string methods
}
存储库示例:
@Repository("nameEntityRepositoryQualifier")
public interface INameEntityRepository extends JpaRepository<NameEntity, Long> {
}
服务示例:
public interface INameEntityService {
public void save(NameEntity entity);
//yours methods
}
服务实现示例:
@Service("nameEntityServiceQualifier")
public class NameEntityServiceImpl implements INameEntityService {
@Autowired
@Qualifier("nameEntityRepositoryQualifier")
INameEntityRepository nameEntityRepository ;
@Override
public void save(NameEntity entity) {
nameEntityRepository.save(entity);
}
}
控制器示例:
@Controller or @RestController
@RequestMapping("/pathController")
public class YourController {
@Autowired
@Qualifier("nameEntityServiceQualifier")
private INameEntityService nameEntityService;
//yours controller methods
}
推荐阅读
- node.js - 从 Buffer node.js 前面移除元素
- html - 内文本的 CSS 选择器
- 元素(定义列表标签)
- vba - 如何将单元格值分成多个单元格(名称、街道、城市、州、邮编)
- arrays - Laravel 数组分组并合并每个组
- scala - 在 Scala SparkSQL 中使用 NVL2 和 NULLIF
- angularjs - 角度订阅问题
- javascript - 如何通过按下按钮将上标文本添加到 HTML 输入框?
- python - 转置 CSV 行和列
- shell - 使用 sh 中的 printf 进行十六进制到十进制转换失败超过 16 位
- r - 将2个数据框的不同大小的列相乘