我有一个案例,我应该在其中制作spring boot webservice,它将从任何来源获取数据。我的休息api是(/ fetchData / {src})其中src是路径变量&它是源(数据库)的名称,例如casandra,mongodb或任何其他nosql ..所以基于我想要初始化bean以与该数据库建立连接。所以我们可以在这种情况下使用@Conditional bean。但问题是,@条件bean检查条件基于属性文件值&这里我们必须根据rest api的路径参数来应用条件。那么我应该使用@Conditional还是其他任何设计模式,比如工厂?
答案 0 :(得分:2)
您不能使用@Conditional
,因为它是在启动时评估的,而路径参数值仅在运行时已知。
您可以做很多解决方案。您可以使用简单的工厂或链。
我用了一些时间的另一个例子:
创建界面
public interface MyDataSource {
SomeOutputData query(Data someDataIn);
boolean supports(String pathParam);
}
创建所有实现(Cassandra,MongoDB等)并将这些列表注入您的服务
@Autowired
private List<MyDataSource> dataSources;
然后你可以选择合适的DataSource,如下所示:
dataSources.stream()
.filter(dataSource -> dataSource.doesSupport(pathParam)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("No datasource"))
.query(dataIn);