如何在Spring Boot中动态筛选接口实现并返回默认实例?
解决方案
核心思路
借助Spring自动收集所有Base接口实现类的特性,通过Stream流筛选匹配实例;当无匹配项时,直接返回Base接口的默认实现,全程无需手动创建工厂类。
调整后的代码实现
修改SomeService中的筛选逻辑,将原有的orElseThrow()替换为orElse(),直接传入Base的匿名实现类(继承接口的默认方法):
@Service @RequiredArgsConstructor class SomeService { private final List<Base> baseList; public void callingClass(String str) { // 按accept规则筛选匹配实例,无匹配则返回Base默认实现 Base base = baseList.stream() .filter(baseImpl -> baseImpl.accept(str)) .findFirst() .orElse(new Base() {}); // 匿名类直接继承Base的默认方法 // 后续可调用base.apply(object)执行业务逻辑 } }
关键说明
- Spring自动注入:由于
A和B都标注了@Service注解,Spring会自动将这两个类的实例收集到List<Base>中,无需额外配置。 - 默认实现的兜底:匿名内部类
new Base() {}会完全继承Base接口的apply和accept默认方法,完美满足"无匹配时返回Base默认逻辑"的需求。 - 可选优化:如果希望默认实现的
accept方法永远不被筛选器匹配,可以显式重写该方法:
.orElse(new Base() { @Override public boolean accept(String str) { return false; } });
内容的提问来源于stack exchange,提问作者Mohit Kumar
相关产品推荐
相关产品推荐

