为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

莫回无 2021-12-22 18:56:09
我有一个有两个实现的接口,我想有条件地在 spring 启动服务中注入这两个实现中的任何一个。关键是应该根据请求消息(映射到 POJO 的 JSON)选择符合条件的实现。我的搜索使我实现了一个FactoryBean来控制这两个实现之间的选择,并让工厂告诉 spring bean 不是单例的(通过为该isSingleton方法返回 false )。但是如果这是正确的方法,我仍然不确定如何获取请求消息来检查它并返回正确的 bean。你能告诉我我是否走在我想要实现的正确轨道上吗?==============更新我不想污染我的代码并处理管理我的服务和服务中依赖项实现之间的关系。考虑到我以后需要处理更多的实现,我需要我的服务只关心它的责任。我需要我的服务只有一个通用接口的引用并以抽象的方式处理它。我需要找到一种基于 spring 的方法,根据从请求本身派生的条件为每个请求选择正确的实现,并将其注入服务中。
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

一种选择是注入两个 bean 并有条件地选择所需的 bean。您可以将实现相同接口的类自动装配到Map.


以下示例使用工厂类来隐藏条件检查。


@Component("type1")

public class Type1 implements SomeInterface{}


@Component("type2")

public class Type2 implements SomeInterface{}


@Component

public class MyTypeFactory {


  @Autowired

  private Map<String, SomeInterface> typesMap;


  public SomeInterface getInstance(String condition){

    return typesMap.get(condition);

  }


}


@Component

public class MyService {

  @Autowired

  private MyTypeFactory factory;


  public void method(String input){

     factory.getInstance(input).callRequiredMethod();

  }


}


查看完整回答
反对 回复 2021-12-22
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您可以@Autowire在控制器中同时使用两个 bean,并根据请求决定返回哪个 bean。


考虑以下接口:


public interface MyInterface { ... }

示例配置:


@Configuration

public class MyConfig {


    @Bean("first")

    public MyInterface firstBean() { ... }


    @Bean("second")

    public MyInterface secondBean() { ... }


}

示例控制器:


@RestController

public class MyController {


    @Autowire

    @Qualifier("first")

    public MyInterface first;


    @Autowire

    @Qualifier("second")

    public MyInterface second;


    @GetMapping

    public MyInterface doStuff(@RequestBody body) {

        if(shouldReturnFirst(body)){

            return first;

        } else {

            return second;

        }

    } 


}

请注意,您很可能不应该这样做,但有一个服务,比如MyService应该为您实现这个逻辑。


@Component

public class MyService {


    public MyInterface doStuff(body) {

        if(shouldReturnFirst(body)){

            // build your response here

        } else {

            // build your response here

        }

    }


}

只需从控制器委托给服务


@GetMapping

public MyInterface doStuff(@RequestBody body) {

    return myService.doStuff(body);


查看完整回答
反对 回复 2021-12-22
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

Spring有一个Conditional Bean的概念...

看看这里https://www.intertech.com/Blog/spring-4-conditional-bean-configuration/


查看完整回答
反对 回复 2021-12-22
  • 3 回答
  • 0 关注
  • 247 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信