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

标签 java spring-boot

我的 Spring boot 项目中有以下 Controller 类,分为接口(interface)和实现:

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 注解移动到界面时,它不起作用。但是在接口(interface)上注释方法是可行的。这两个注释有何不同?

最佳答案

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

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

至于为什么 Spring 的实现不允许第一个继承而允许第二个继承,我只能推测:

  • 我认为您的示例构成了 @Mapping 继承的有用用例,因为您可以拥有多个具有不同 url 前缀的 RestController,但除此之外具有相同的端点。
  • 使 @Component 注解可继承可能会导致非自愿创建 Spring Bean,因为客户端在实现接口(interface)时可能无法注意到该注解。

关于java - 如何将Service/Controller层类拆分为interface和impl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52455268/

相关文章:

java - 如何从 spring-boot 应用程序中的 application.yml 文件读取属性

java - 如何使用默认访问(或包默认)访问构造函数

java.security.AccessControlException : access denied (java. util.PropertyPermission http.agent 读取)

java - 具有n级依赖关系的多模块maven spring boot项目

java - 使用@Async 注释的方法未被异步调用,并且在应用程序上下文启动之前收到 ContextRefreshedEvent

java - 使用 docker 在 EC2 中部署时 Spring Boot 应用程序不可用 - 错误 404

java - 为什么在 Java 8 split 中有时会删除结果数组开头的空字符串?

java - 如何让Runtime.getRuntime().exec一一执行命令并获取输出而不是执行所有命令

java - 在查询、jpa 存储库和 spring boot 中使用非硬编码值

java - 基于 Spring Boot 中配置的 SOLID IoC