Java 如何将服务/控制器层类拆分为接口和impl?

Java 如何将服务/控制器层类拆分为接口和impl?,java,spring-boot,Java,Spring Boot,我的Spring boot项目中有以下控制器类,分为接口和实现: public interface UserAccountController { @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(@RequestBody UserAccountEntity account, HttpServletResponse response) th

我的Spring boot项目中有以下控制器类,分为接口和实现:

public interface UserAccountController {

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(@RequestBody UserAccountEntity account,
            HttpServletResponse response) throws IOException;

    @RequestMapping(value = "/signup", method = RequestMethod.POST)
    public String create(@Valid @RequestBody UserAccountEntity userAccount,
            HttpServletResponse response, BindingResult result);

}

@RestController
@RequestMapping("/api/authentication")
public class UserAccountControllerImpl implements UserAccountController {

    @Autowired
    private UserAccountService userAccountService;

    @Override
    public String login(@Valid @RequestBody UserAccountEntity account,
            HttpServletResponse response) throws IOException {
            //...
    }

    @Override
    public String create(@Valid @RequestBody UserAccountEntity userAccount,
            HttpServletResponse response, BindingResult result) {
            //....
    }
}

当我将RestController和RequestMapping注释移动到接口时,它不起作用。但是在接口上注释方法是可行的。这两个注释有何不同

@RestController
继承自
@Controller
,后者继承自@Component,从而在应用程序上下文中创建Springbean

@RequestMapping
继承自
@Mapper
,用于将Rest或Web控制器方法标记为处理程序方法

至于为什么Spring在第一个方面不允许继承,而在第二个方面允许继承,我只能推测:

  • 我认为您的示例为
    @Mapping
    继承提供了一个有用的用例,因为您可以有多个具有不同url前缀的RESTController,但除了相同的端点之外
  • 使
    @Component
    注释可继承可能会导致非自愿创建Springbean,因为客户端在实现接口时可能没有注意到注释