Spring 从依赖项中选择运行时实现
Spring choose implementation at runtime from dependencies
我有 5 个模块。
- 数据库接口
- DB 实现 A
- DB 实现 B
- 应用 1
- 应用 2
在 App 1 中,我只想使用 DB impl A,因此我包含了对 DB 接口和 DB impl A 的依赖。
在 App 2 中,我想同时使用这两个 impl。选择 impl 的条件取决于每个请求和数据库查询。例如,请求有一些令牌,我们用它来从 impl 选择的数据库中查询。
来自 A 和 B 的实现使用 @Repository 进行注释。
我正在考虑使用一些具有请求范围和@Condition 的持有人。但是这个来自 impl A 和 impl B 的 类 不能通过添加新的 adnotations 来改变,因为在 App 1 中我们不能保证条件通过。
保持简单:在 App2 中,将两个 DB 实现依赖项(DB impl A 和 DB impl B)注入到需要它的 bean 中,然后针对每个请求并根据您的 "rules",只需使用第一个还是第二个。
现在,如果在 App2 中,多个 bean 需要使用两个 DB 实现,定义一个组成它们的 bean 是一个更好的选择,它会使代码不那么冗长和重复,你也可以在这个聚合器 bean 中提取规则。
我有 5 个模块。
- 数据库接口
- DB 实现 A
- DB 实现 B
- 应用 1
- 应用 2
在 App 1 中,我只想使用 DB impl A,因此我包含了对 DB 接口和 DB impl A 的依赖。
在 App 2 中,我想同时使用这两个 impl。选择 impl 的条件取决于每个请求和数据库查询。例如,请求有一些令牌,我们用它来从 impl 选择的数据库中查询。
来自 A 和 B 的实现使用 @Repository 进行注释。
我正在考虑使用一些具有请求范围和@Condition 的持有人。但是这个来自 impl A 和 impl B 的 类 不能通过添加新的 adnotations 来改变,因为在 App 1 中我们不能保证条件通过。
保持简单:在 App2 中,将两个 DB 实现依赖项(DB impl A 和 DB impl B)注入到需要它的 bean 中,然后针对每个请求并根据您的 "rules",只需使用第一个还是第二个。
现在,如果在 App2 中,多个 bean 需要使用两个 DB 实现,定义一个组成它们的 bean 是一个更好的选择,它会使代码不那么冗长和重复,你也可以在这个聚合器 bean 中提取规则。