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);
}