Spring boot 在运行时根据请求端点/请求参数注入 bean

我有一个有两个实现的接口,我想有条件地在 spring 启动服务中注入这两个实现中的任何一个。

关键是应该根据请求消息(映射到 POJO 的 JSON)选择符合条件的实现。

我的搜索使我实现了一个FactoryBean来控制这两个实现之间的选择,并让工厂告诉 spring bean 不是单例的(通过为该isSingleton方法返回 false )。

但是如果这是正确的方法,我仍然不确定如何获取请求消息来检查它并返回正确的 bean。

你能告诉我我是否走在我想要实现的正确轨道上吗?

==============

更新

我不想污染我的代码并处理管理我的服务和服务中依赖项实现之间的关系。

考虑到我以后需要处理更多的实现,我需要我的服务只关心它的责任。

  1. 我需要我的服务只有一个通用接口的引用并以抽象的方式处理它。

  2. 我需要找到一种基于 spring 的方法,根据从请求本身派生的条件为每个请求选择正确的实现,并将其注入服务中。


莫回无
浏览 248回答 3
3回答

一只斗牛犬

一种选择是注入两个 bean 并有条件地选择所需的 bean。您可以将实现相同接口的类自动装配到Map.以下示例使用工厂类来隐藏条件检查。@Component("type1")public class Type1 implements SomeInterface{}@Component("type2")public class Type2 implements SomeInterface{}@Componentpublic class MyTypeFactory {&nbsp; @Autowired&nbsp; private Map<String, SomeInterface> typesMap;&nbsp; public SomeInterface getInstance(String condition){&nbsp; &nbsp; return typesMap.get(condition);&nbsp; }}@Componentpublic class MyService {&nbsp; @Autowired&nbsp; private MyTypeFactory factory;&nbsp; public void method(String input){&nbsp; &nbsp; &nbsp;factory.getInstance(input).callRequiredMethod();&nbsp; }}

慕无忌1623718

您可以@Autowire在控制器中同时使用两个 bean,并根据请求决定返回哪个 bean。考虑以下接口:public interface MyInterface { ... }示例配置:@Configurationpublic class MyConfig {&nbsp; &nbsp; @Bean("first")&nbsp; &nbsp; public MyInterface firstBean() { ... }&nbsp; &nbsp; @Bean("second")&nbsp; &nbsp; public MyInterface secondBean() { ... }}示例控制器:@RestControllerpublic class MyController {&nbsp; &nbsp; @Autowire&nbsp; &nbsp; @Qualifier("first")&nbsp; &nbsp; public MyInterface first;&nbsp; &nbsp; @Autowire&nbsp; &nbsp; @Qualifier("second")&nbsp; &nbsp; public MyInterface second;&nbsp; &nbsp; @GetMapping&nbsp; &nbsp; public MyInterface doStuff(@RequestBody body) {&nbsp; &nbsp; &nbsp; &nbsp; if(shouldReturnFirst(body)){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return first;&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return second;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp;}请注意,您很可能不应该这样做,但有一个服务,比如MyService应该为您实现这个逻辑。@Componentpublic class MyService {&nbsp; &nbsp; public MyInterface doStuff(body) {&nbsp; &nbsp; &nbsp; &nbsp; if(shouldReturnFirst(body)){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // build your response here&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // build your response here&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}只需从控制器委托给服务@GetMappingpublic MyInterface doStuff(@RequestBody body) {&nbsp; &nbsp; return myService.doStuff(body);}&nbsp;

眼眸繁星

Spring有一个Conditional Bean的概念...看看这里https://www.intertech.com/Blog/spring-4-conditional-bean-configuration/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java