Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring boot中注入许多实现之一_Java_Spring_Spring Boot - Fatal编程技术网

Java 在Spring boot中注入许多实现之一

Java 在Spring boot中注入许多实现之一,java,spring,spring-boot,Java,Spring,Spring Boot,假设我有一个控制器,它处理请求,比如www.xyz.com/api/。这是我的控制器和我的服务: @Controller public class MyController { @Autowired MyService service; @RequestMapping(value = "/api/{someParam}", method = RequestMethod.GET) public String processRequest( @PathVari

假设我有一个控制器,它处理请求,比如
www.xyz.com/api/
。这是我的控制器和我的服务:

@Controller
public class MyController {

   @Autowired MyService service;

   @RequestMapping(value = "/api/{someParam}", method = RequestMethod.GET)  
   public String processRequest(
       @PathVariable("someParam") String someParam) {
          return service.processRequest(someParam);     
   }
}

@Service
public class MyService {
   @Autowired APICaller apiCaller;

   public String processRequest(someParam){
      SomeObj obj = apiCaller.callApi();
      // do something with obj
      // return response;
   }
}
基于URL中传递的参数,我需要调用一些API,对API响应进行一些处理,然后返回它。所有这些API都有不同的处理

假设APICaller接口如下所示:

@Service
public interface APICaller {
    public SomeObj callAPI();
}

@Service
public class ABC implements APICaller {
    @Override
    public SomeObj callAPI() {
         // calls some REST api, does some processing to response and returns SomeObj
    }
}

@Service
public class XYZ implements APICaller {
    @Override
    public SomeObj callAPI() {
         // calls some SOAP api, does some processing to response and returns SomeObj
    }
}
因此,如果url中的参数是“abc”,我需要调用
ABCImpl
。如果是“xyz”,那么我需要调用
XYZImpl
。我应该在
MyService
类中做什么来实例化正确的实现?我可能有多个基于param的实现,而不仅仅是这两个


谢谢。

在配置类中定义bean的命名映射

@SpringBootApplication
public class Application {

    @Bean
    ABC abc() {
        return new ABC();
    }

    @Bean
    XYZ xyz() {
        return new XYZ();
    }

    @Bean(name="apis")
    Map<String, APICaller> apis() {
        Map<String, APICaller> map = new HashMap<>();
        map.put("xmz", xyz());
        map.put("abc", abc());
        return map;
    }
}

假设您使用
@限定符(“beanName”)
。参考此内容可能会有所帮助。请查看此帖子:Thx,但如果我返回一个
new ABC()
,则它将不属于Spring托管上下文的一部分,这意味着我不能在类中使用任何Spring注释,例如
@Autowired
。这是主要的问题。它仍然是一个春豆。您必须在bean初始化期间(即在上面的配置类中)注入依赖项(即使用setter通过Java编程)。或者,您可以使用bean方法中的参数自动关联。答案已更新。
@Service
public class MyService {
      @Resource(name="apis")
      Map<String, APICaller> apis;

      public String processRequest(String param){
         apis.get(param).callApi();
         // do required null checks before calling callApi()
         // do something with obj
         // return response;
      }
}
@Bean
ABC abc(DependancyBean1 bean2) {
    return new ABC(bean1);
}

@Bean
XYZ xyz(DependancyBean2 bean2) {
    return new XYZ(bean2);
}