Java 从不同的servlet在同一控制器中注入不同的服务bean实现

Java 从不同的servlet在同一控制器中注入不同的服务bean实现,java,spring,spring-mvc,Java,Spring,Spring Mvc,我不熟悉基于注释的控制器。我有两个类似的servlet: url:pathA的pathA servlet/* url:pathB的pathB servlet/* 我有一个控制器,比如: public class MyController extends SimpleFormController { private MyService myService; } 和两个服务实现: public class MyService1 implements MyService { } publ

我不熟悉基于注释的控制器。我有两个类似的servlet:

url:pathA的pathA servlet/* url:pathB的pathB servlet/*

我有一个控制器,比如:

public class MyController extends SimpleFormController {

   private MyService myService; 
}

和两个服务实现:

public class MyService1 implements MyService {
}

public class MyService2 implements MyService {
}
在pathA servlet中:

<bean name="/doSomeThing" class="MyController">
   <property name="myService" ref="myService"/>
</bean>

<bean id="myService" class="MyService1"/>
在pathB servlet中:

<bean name="/doSomeThing" class="MyController">
   <property name="myService" ref="myService"/>
</bean>

<bean id="myService" class="MyService2"/>

现在,我正尝试使用@controller、@RequestMapping对基于注释的控制器执行同样的操作。我该怎么做

这是一个@Controller示例。这是一个rest端点,您可以使用

@Controller
@RequestMapping(method = RequestMethod.POST, value = "/my")
public class CopyOfMyController {

    @Autowired
    private MyService service;

    @RequestMapping(method = RequestMethod.POST, value = "/hib")
    public void haha(@ResponseBody RequestDTO dto) {
        service.doSomething(dto);
    }

}
你可以打它

Dto dto = new Dto();
dto.setPhone("12313");
RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(new URI("http://localhost:8080/my/hib"), dto, Dto.class);

这很简单。在控制器中,首先添加@controller注释。这个注释简单地说,这个类将是一个Spring控制器,它能够根据控制器的方法中定义的url映射来处理HTTP请求

还为服务属性添加@Autowired注释。因为MyService有两个实现,所以通过传递bean名称添加@Qualifier,因为Spring无法选择注入哪个bean

所以你可以这样做:

 @Controller
 public class MyController {

     @Autowired
     @Qualifier("bean1") // This should be bean1
     private MyService myService1; 

     @Autowired
     @Qualifier("bean2")
     private MyService myService2;  

     @RequestMapping(value = "/doSomeThing1", method = RequestMethod.GET)
     public String doSomething(){
        return myService1.doSomething();
     }

     @RequestMapping(value = "/doSomeThing2", method = RequestMethod.GET)
     public String doSomething(){
        return myService2.doSomething();
     }
}

我在问如何使用\@controller和\@RequestMapping从两个不同的servlet在同一个控制器中注入两个不同的服务实现。这可以在SimpleFormController中实现,但在基于注释的控制器中如何实现呢@斯塔克德夫:有什么不同吗?只要确保两个servlet中都只有一个MyService实例,并使用@Autowired或像现在一样注入它。使用@Controller并不意味着不能再使用xml配置。