根据条件进行依赖注入

时间:2018-10-03 20:24:29

标签: java spring-boot dependency-injection

我的控制器:

@RestController
@RequestMapping("/mypath")
public class MyController {
   @Autowired
   MyServiceInterface service;

   @PostMapping("/{source}")
   void myControllerFunc(@PathVariable String source, @RequestBody MyObject obj) {
       ...
       Object myServiceObj = service.myServiceFunc(param);
       ...
   }
}

我的服务界面:

public interface MyServiceInterface {

   Object myServiceFunc(String param);

}

我的服务障碍:

@Service    
public class MyServiceOne {

   Object myServiceFunc(String param) {
       ...
   }

}

@Service
public class MyServiceTwo {

   void myServiceFunc(String param) {
       ...
   }

}

我的春季启动版本:1.5.7

我想根据我的path变量(“ source”)注入服务。如果source = 1,则注入MyServiceOne;如果source = 2,则注入MyServiceTwo。

这可能吗?

3 个答案:

答案 0 :(得分:2)

听起来您需要同时使用这两个功能,并且控制器上的每个方法调用都可以选择一个不同的方法。因此,用限定符区分这两种实现。在controller方法中使用path变量,并使其以编程方式决定要调用的服务。

答案 1 :(得分:1)

我认为这是不可能和合理的。

@RestController本质上是一个单例。它在启动时进行配置,并且对于每个请求都保持不变。

表达式/{source}在运行时的请求过程中已被设置控制器时正在求值。

要考虑的选项:

  1. 同时注入两种服务,并在方法中决定选择哪一种。
  2. 为每个服务创建两个单独的控制器。
  3. 利用应用程序上下文并从中提取bean。

答案 2 :(得分:0)

Get bean from ApplicationContext by qualifier中所述,您可以在每个服务实现中添加限定符,并在myControllerFunc中具有以下内容:

BeanFactoryAnnotationUtils.qualifiedBeanOfType(ctx.getBeanFactory(), MyServiceInterface.class, source)