如何将Service / Controller层类拆分为interface和impl?

时间:2018-09-22 09:21:08

标签: java spring-boot

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

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注释移至该接口时,它不起作用。但是在接口上注释方法是可行的。这两个注释有何不同?

1 个答案:

答案 0 :(得分:1)

@RestController继承自@Controller,后者继承自@Component,从而导致在应用程序上下文中创建Spring Bean。

@RequestMapping继承自@Mapper,用于将Rest-或Web-Controller方法标记为处理程序方法。

关于为什么实施Spring来禁止继承第一个继承,而允许第二个继承,我只能推测:

  • 我认为您的示例为@Mapping继承提供了一个有用的用例,因为您可能有多个带有不同URL前缀的RestController,但端点相同。
  • 使@Component注释可继承可能导致非自愿创建的Spring Bean,因为客户端在实现接口时可能无法注意到注释。